Elasticsearch MatchQuery 返回错误结果

Elasticsearch MatchQuery is returning wrong results

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

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

字段 TransactionId_s 不是 keyword。我期待 matchQuery 匹配我给出的确切字符串和 return 结果。 Elasticsearch 中不应有 TransactionId_sBulkRunTest.20Nov20201446.00 的文档。但我得到了一些结果,它们有如下 TransactionId_s

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

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

如有任何帮助,我们将不胜感激。谢谢。

Match 查询被分析,即它应用了在索引时在字段上使用的相同分析器,您可以 analyzer 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"
                }
            }
        ]