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_s
为 BulkRunTest.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"
}
}
]
我正在使用 matchQuery
在 Java 中查询 Elasticsearch。以下是我的查询:
sourceBuilder.query(QueryBuilders.matchQuery("TransactionId_s","BulkRunTest.20Nov20201446.00"));
字段 TransactionId_s
不是 keyword
。我期待 matchQuery 匹配我给出的确切字符串和 return 结果。 Elasticsearch 中不应有 TransactionId_s
为 BulkRunTest.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"
}
}
]