java - Elasticsearch MatchQuery 返回错误的结果
问题描述
我正在使用 amatchQuery
在 Java 中查询 Elasticsearch。以下是我的查询:
sourceBuilder.query(QueryBuilders.matchQuery("TransactionId_s","BulkRunTest.20Nov20201446.00"));
该字段TransactionId_s
不是keyword
. 我期望 matchQuery 匹配我给出的确切字符串并返回结果。Elasticsearch 中不应该有带有TransactionId_s
as 的文档BulkRunTest.20Nov20201446.00
。但是我得到了一些结果,它们具有TransactionId_s
以下内容:
"TransactionId_s" : "BulkRunTest.17Sep20201222.00"
"TransactionId_s" : "BulkRunTest.22Sep20201450.00"
"TransactionId_s" : "BulkRunTest.20Sep20201250.00"
当我尝试使用 atermQuery
而不是 时matchQuery
,我得到 0 个结果,这是预期的结果。我认为matchQuery
可以让我查询给定值的任何字段,而不必担心标记化。我错了吗?我该如何解决我看到的问题?
任何帮助将非常感激。谢谢你。
解决方案
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"
}
}
]
推荐阅读
- jquery - 分离标签和附加标签
- php - 在新标签页中打开 Woocommerce 产品
- angular - For 循环在 TypeScript (ES 6) 中创建键值对
- vb.net - 在文本框中以整数形式查找值
- python - 有没有办法将数据框样式器对象转换为python中的数据框
- python - python固定数组的动态字符串列表
- laravel-5 - 遇到问题“找不到类‘应用程序/类别’”
- python - 无法访问 kivy 中的弹出窗口内容
- python - 如何在 qml 或 PySide2 中更改 XYSeries 中的所有点?
- php - 如果会话值未使用 PHP 设置,则从数据库中检索会话内容