问题描述
在我的弹性搜索中,我的文档包含一个“fieldname”,值为“abc”和“abc-def”。当我使用 match_phrase 查询搜索字段名称为“abc”的文档时,它也会返回值为“abc-def”的文档。但是,当我查询“abc-def”时,它工作正常。我的查询如下:
Get my_index/_search
{
"query" : {
"match_phrase" : {"fieldname" : "abc"}
}
}
有人能帮我理解这个问题吗?
解决方法
- match_phrase 查询根据为字段提供的分析器分析搜索词(如果未添加分析器,则默认使用 standard analyzer)。
匹配短语查询会搜索字段中存在所有术语(来自搜索术语)的文档,并且这些术语必须以正确的顺序出现。
-
在您的情况下,
"abc-def"
被标记为"abc"
和"def"
(因为标准分析器)。现在,当您对"abc-def"
使用匹配短语查询时,这将搜索同时具有abc
和def
相同顺序的所有文档。 (因此您在结果中只得到 1 个文档) -
当搜索
"abc"
时,这将搜索在abc
字段中有fieldname
的那些文档(因为两个文档都包含abc
,所以两者都包含在结果中返回)
如果您只想在结果中返回完全匹配的文档,那么您需要更改术语的分析方式。
- 如果您尚未明确定义任何映射,则需要将
.keyword
添加到fieldname
字段。这使用关键字分析器而不是标准分析器(注意 fieldname 字段后面的“.keyword”)。
添加一个包含索引数据、映射、搜索查询和搜索结果的工作示例
索引数据:
{
"name":"abc-def"
}
{
"name":"abc"
}
搜索查询:
{
"query": {
"match_phrase": {
"name.keyword": "abc"
}
}
}
搜索结果:
"hits": [
{
"_index": "67394740","_type": "_doc","_id": "1","_score": 0.6931471,"_source": {
"name": "abc"
}
}
]