首页 > 解决方案 > Elasticsearch MatchQuery 返回错误的结果

问题描述

我正在使用 amatchQuery在 Java 中查询 Elasticsearch。以下是我的查询:

sourceBuilder.query(QueryBuilders.matchQuery("TransactionId_s","BulkRunTest.20Nov20201446.00"));

该字段TransactionId_s不是keyword. 我期望 matchQuery 匹配我给出的确切字符串并返回结果。Elasticsearch 中不应该有带有TransactionId_sas 的文档BulkRunTest.20Nov20201446.00。但是我得到了一些结果,它们具有TransactionId_s以下内容:

"TransactionId_s" : "BulkRunTest.17Sep20201222.00"
"TransactionId_s" : "BulkRunTest.22Sep20201450.00"
"TransactionId_s" : "BulkRunTest.20Sep20201250.00"

当我尝试使用 atermQuery而不是 时matchQuery,我得到 0 个结果,这是预期的结果。我认为matchQuery可以让我查询给定值的任何字段,而不必担心标记化。我错了吗?我该如何解决我看到的问题?

任何帮助将非常感激。谢谢你。

标签: javaelasticsearchaws-elasticsearchelasticsearch-java-apielasticsearch-7

解决方案


Match查询被分析,即它应用了在索引时在字段上使用的相同分析器,您可以分析 API并查看索引和搜索词的标记。

考虑到您有一个text带有默认分析器(标准)的字段,它将为搜索词生成以下标记BulkRunTest.20Nov20201446.00

POST /_analyze
{
    "analyzer" : "standard",
    "text" : "BulkRunTest.20nov20201446.00"
}

并生成令牌

{
    "tokens": [
        {
            "token": "bulkruntest", // notice this token
            "start_offset": 0,
            "end_offset": 11,
            "type": "<ALPHANUM>",
            "position": 0
        },
        {
            "token": "20nov20201446.00",
            "start_offset": 12,
            "end_offset": 28,
            "type": "<ALPHANUM>",
            "position": 1
        }
    ]
}

现在让我们看看其中一个匹配文档的标记BulkRunTest.17Sep20201222.00

POST /_analyze
{
    "analyzer" : "standard",
    "text" : "BulkRunTest.17Sep20201222.00"
}

并生成令牌

{
    "tokens": [
        {
            "token": "bulkruntest", // notice same token 
            "start_offset": 0,
            "end_offset": 11,
            "type": "<ALPHANUM>",
            "position": 0
        },
        {
            "token": "17sep20201222.00",
            "start_offset": 12,
            "end_offset": 28,
            "type": "<ALPHANUM>",
            "position": 1
        }
    ]
}

如您所见bulkruntest,索引词和搜索词中的标记相同,因此匹配查询返回搜索结果,并且与另一个索引文档相同。

如果您使用默认的自动生成的映射并且有.keyword子字段,那么您可以使用该.keyword字段进行精确搜索。

工作示例

{
  "query": {
    "term": {   // term query
      "TransactionId_s.keyword": {   // .keyword subfield is used
        "value": "BulkRunTest.20Nov20201446.00"
      }
    }
  }
}

和搜索结果

"hits": [
            {
                "_index": "test_in",
                "_type": "_doc",
                "_id": "2",
                "_score": 0.6931471,
                "_source": {
                    "TransactionId_s": "BulkRunTest.20Nov20201446.00"
                }
            }
        ]

推荐阅读