elasticsearch - 为什么这个弹性搜索查询不返回任何内容
问题描述
我执行了以下elasticsearch
查询。
GET amasyn/_search
{
"query": {
"bool" : {
"filter" : {
"term": {"ordernumber": "112-9550919-9141020"}
}
}
}
}
但它没有得到任何点击
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 0,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
}
}
但是我有一个文档ordernumber
在索引中有这个。
ordernumber
是一个文本字段。
当我通过替换来更改上述查询term
时match
,我得到的总命中数作为给定查询的命中数。请解释这里发生了什么以及如何解决这个问题。
解决方案
这是因为由于您使用ordernumber
类型为文本的字段,因此正在对其进行分析。请通过此答案参考 text 和 keyword之间的区别 Difference between keyword and text in ElasticSearch。
ordernumber
通过这种方式,您可以为您的字段定义文本和关键字。
映射
{
"mappings": {
"properties": {
"ordernumber": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
然后您可以使用术语查询,如下所示:
{
"query": {
"bool" : {
"filter" : {
"term": {"ordernumber.keyword": "112-9550919-9141020"}
}
}
}
}
请参阅如何为您的文本标记字段text
和字段。keyword
标准分析仪
当您将字段定义为text
.
{
"analyzer": "standard",
"text" : "112-9550919-9141020"
}
结果 :
{
"tokens": [
{
"token": "112",
"start_offset": 0,
"end_offset": 3,
"type": "<NUM>",
"position": 0
},
{
"token": "9550919",
"start_offset": 4,
"end_offset": 11,
"type": "<NUM>",
"position": 1
},
{
"token": "9141020",
"start_offset": 12,
"end_offset": 19,
"type": "<NUM>",
"position": 2
}
]
}
关键字分析器
当您将字段定义为keyword
.
{
"analyzer": "keyword",
"text" : "112-9550919-9141020"
}
结果
{
"tokens": [
{
"token": "112-9550919-9141020",
"start_offset": 0,
"end_offset": 19,
"type": "word",
"position": 0
}
]
}
推荐阅读
- apache-kafka - Kafka 如果消费者组成员出现故障,消息会发生什么?
- caching - 计算 2 个缓存级别的 CPI?
- google-colaboratory - 尝试在 google colab 中执行 easygui 模块,但没有收到显示名称和 $DISPLAY 环境变量
- pythonanywhere - 如何使用 react native 将文件上传到 pythonanywhere?
- c - 变量超出了 for 循环中的指定限制
- c++ - “表达式必须是可修改的左值”是什么意思?
- flutter - 导航到其他屏幕时路由抛出异常“有多个英雄在子树中共享相同的标签”
- nginx - proxy_pass 到 HTTP 协议后如何保存 HTTPS 协议?
- java - 该按钮不可见,它将连接 android studio 中的另一个活动
- android - 如何在“自定义”工具栏的菜单项上使用 setOnClickListner?