弹性搜索查询不返回结果
Elastic search query not returning results
我有一个没有返回数据的 Elastic Search 查询。这里有两个查询示例 - 第一个有效 returns 一些记录,但第二个 returns 什么都没有 - 我错过了什么?
示例 1 有效:
curl -X GET "localhost:9200/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"match": {
"data.case.field1": "ABC123"
}
}
}
'
示例 2 无效:
curl -X GET "localhost:9200/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"bool": {
"must": {
"term" : { "data.case.field1" : "ABC123" }
}
}
}
}
'
data.case.field1
的映射是什么?如果它是 text 类型,您应该使用 match 查询而不是 term.
除非我们知道映射类型为text
或keyword
。在不知道所涉及的所有变量的情况下,它是在黑暗中相对回答的。也许您可以尝试以下方法。
curl -X GET "localhost:9200/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"bool": {
"filter": { <- Try this if you have datatype as keyword
"term" : { "data.case.field1" : "ABC123" }
}
}
}
}
'
这是由于 match
和 term
查询之间的差异而发生的,match
查询是 analyzed,这意味着它应用了搜索词上的相同分析器,在索引时在字段上使用,而 term
查询未被分析,并用于精确搜索,并且 search term
在术语查询中不经过 analysis process.
的官方文档
Returns documents that contain an exact term in a provided field.
的官方文档
Returns documents that match a provided text, number, date or boolean
value. The provided text is analyzed before matching.
如果您在 data.case.field1
中使用文本字段而没有任何显式分析器,则将应用文本字段的默认分析器(标准),它将文本小写并存储结果标记。
对于您的文本,标准分析器会生成以下标记,请参阅Analyze API了解更多详情。
{
"text" : "ABC123",
"analyzer" : "standard"
}
并生成token
{
"tokens": [
{
"token": "abc123",
"start_offset": 0,
"end_offset": 6,
"type": "<ALPHANUM>",
"position": 0
}
]
}
现在,当您使用 term
查询作为搜索词时,将不会按原样进行分析和使用,它在 captical char(ABC123) 中与标记不匹配在索引中,因此没有 return 结果。
PS:请参阅我的 以了解有关术语和匹配查询的更多详细信息。
我有一个没有返回数据的 Elastic Search 查询。这里有两个查询示例 - 第一个有效 returns 一些记录,但第二个 returns 什么都没有 - 我错过了什么?
示例 1 有效:
curl -X GET "localhost:9200/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"match": {
"data.case.field1": "ABC123"
}
}
}
'
示例 2 无效:
curl -X GET "localhost:9200/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"bool": {
"must": {
"term" : { "data.case.field1" : "ABC123" }
}
}
}
}
'
data.case.field1
的映射是什么?如果它是 text 类型,您应该使用 match 查询而不是 term.
除非我们知道映射类型为text
或keyword
。在不知道所涉及的所有变量的情况下,它是在黑暗中相对回答的。也许您可以尝试以下方法。
curl -X GET "localhost:9200/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"bool": {
"filter": { <- Try this if you have datatype as keyword
"term" : { "data.case.field1" : "ABC123" }
}
}
}
}
'
这是由于 match
和 term
查询之间的差异而发生的,match
查询是 analyzed,这意味着它应用了搜索词上的相同分析器,在索引时在字段上使用,而 term
查询未被分析,并用于精确搜索,并且 search term
在术语查询中不经过 analysis process.
的官方文档Returns documents that contain an exact term in a provided field.
Returns documents that match a provided text, number, date or boolean value. The provided text is analyzed before matching.
如果您在 data.case.field1
中使用文本字段而没有任何显式分析器,则将应用文本字段的默认分析器(标准),它将文本小写并存储结果标记。
对于您的文本,标准分析器会生成以下标记,请参阅Analyze API了解更多详情。
{
"text" : "ABC123",
"analyzer" : "standard"
}
并生成token
{
"tokens": [
{
"token": "abc123",
"start_offset": 0,
"end_offset": 6,
"type": "<ALPHANUM>",
"position": 0
}
]
}
现在,当您使用 term
查询作为搜索词时,将不会按原样进行分析和使用,它在 captical char(ABC123) 中与标记不匹配在索引中,因此没有 return 结果。
PS:请参阅我的