弹性搜索:查询字段中包含"."的文档时出现问题



我有一个索引,其中一些条目类似

{
"name" : " Stefan Drumm"
}
...
{
"name" : "Dr. med. Elisabeth Bauer"
}

name字段的映射是

{
"name": {
"type": "text",
"analyzer": "index_name_analyzer",
"search_analyzer": "search_cross_fields_analyzer"
}
}

当我使用以下查询时

GET my_index/_search
{"size":10,"query":
{"bool":
{"must":
[{"match":{"name":{"query":"Stefan Drumm","operator":"AND"}}}]
,"boost":1.0}},
"min_score":0.0}

它返回第一个文档。

但是当我尝试使用下面的查询获取第二个文档时

GET my_index/_search
{"size":10,"query":
{"bool":
{"must":
[{"match":{"name":{"query":"Dr. med. Elisabeth Bauer","operator":"AND"}}}]
,"boost":1.0}},
"min_score":0.0}

它没有归还任何东西。

我不能做的事

  1. 无法更改索引
  2. 无法使用"查询"一词
  3. 将运算符更改为"OR",因为在这种情况下,它将返回多个条目,这是我不希望的

我做错了什么?如何通过修改查询来实现这一点?

您为索引和搜索配置了不同的分析器(index_name_analyzersearch_cross_fields_analyzer(。如果这些分析器以不兼容的方式处理输入Dr. med. Elisabeth Bauer,则搜索将不匹配。这在索引和搜索分析以及控制分析中有更详细的描述。

您没有提供这两个分析器的定义,因此很难从您的问题中猜测它们在做什么。根据分析器的不同,在执行搜索之前可能会预处理查询字符串(例如,通过删除.(,以便搜索匹配。

您可以使用_analyzeAPI来研究分析如何影响搜索,如测试分析器中所述。例如,命令

GET my_index/_analyze
{
"analyzer": "index_name_analyzer", 
"text":     "Dr. med. Elisabeth Bauer"
}

GET my_index/_analyze
{
"analyzer": "search_cross_fields_analyzer", 
"text":     "Dr. med. Elisabeth Bauer"
}

应该向您展示为索引配置的两个分析器是如何处理目标字符串的,这可能会为您提供错误的线索。反应将类似

{
"tokens": [
{
"token": "dr",
"start_offset": 0,
"end_offset": 2,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "med",
"start_offset": 4,
"end_offset": 7,
"type": "<ALPHANUM>",
"position": 1
},
{
"token": "elisabeth",
"start_offset": 9,
"end_offset": 18,
"type": "<ALPHANUM>",
"position": 2
},
{
"token": "bauer",
"start_offset": 19,
"end_offset": 24,
"type": "<ALPHANUM>",
"position": 3
}
]
}  

对于上面的示例输出,分析器将输入拆分为每个单词一个标记,每个单词小写,并丢弃所有标点符号。

我的猜测是index_name_analyzer保留标点符号,而search_cross_fields_analyzer丢弃它,这样标记就不匹配了。如果是这种情况,并且您无法更改索引配置(正如您在问题中所述(,则另一种选择是在运行查询时指定不同的分析器:

GET my_index/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": {
"query": "Dr. med. Elisabeth Bauer",
"operator": "AND",
"analyzer": "index_name_analyzer"
}
}
}
],
"boost": 1
}
},
"min_score": 0
}

在上面的查询中,analyzer参数已设置为覆盖搜索分析,以使用与索引时使用的分析器相同的分析器(index_name_analyzer(。使用什么样的分析器可能有意义取决于您的设置。理想情况下,您应该将分析器配置为对齐,这样您就不必在搜索时覆盖,但听起来您并不是生活在理想的世界中。

最新更新