弹性搜索查询不返回结果

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.

请参阅本页顶部的警告:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html#query-dsl-term-query

除非我们知道映射类型为textkeyword。在不知道所涉及的所有变量的情况下,它是在黑暗中相对回答的。也许您可以尝试以下方法。

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" }
      }
    }
  }
}

'

这是由于 matchterm 查询之间的差异而发生的,match 查询是 analyzed,这意味着它应用了搜索词上的相同分析器,在索引时在字段上使用,而 term 查询未被分析,并用于精确搜索,并且 search term 在术语查询中不经过 analysis process.

term query

的官方文档

Returns documents that contain an exact term in a provided field.

match query

的官方文档

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:请参阅我的 以了解有关术语和匹配查询的更多详细信息。