我用的是 matchQuery
在java中查询elasticsearch。以下是我的疑问: sourceBuilder.query(QueryBuilders.matchQuery("TransactionId_s","BulkRunTest.20Nov20201446.00"));
田野 TransactionId_s
不是一个 keyword
. 我希望matchquery与我给出的字符串完全匹配并返回结果。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
允许我查询给定值的任何字段,而不必担心标记化。我错了吗?我该如何解决我看到的问题?
任何帮助都将不胜感激。谢谢您。
1条答案
按热度按时间lskq00tm1#
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": "",
"position": 0
},
{
"token": "20nov20201446.00",
"start_offset": 12,
"end_offset": 28,
"type": "",
"position": 1
}
]
}
和生成的代币
如你所见
bulkruntest
在索引项和搜索项中都是相同的标记,因此匹配查询返回搜索结果,而在另一个索引文档中也是相同的。如果使用默认的自动生成Map
.keyword
子字段,则可以使用.keyword
用于精确搜索的字段。工作示例
和搜索结果