gpt4 book ai didi

elasticsearch - Elasticsearch:查询文档,字段中包含 “.”时出现问题

转载 作者:行者123 更新时间:2023-12-03 01:12:14 25 4
gpt4 key购买 nike

我有一些条目的索引

{
"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}
它没有返回任何东西。
我做不到的事情
  • 无法更改索引
  • 不能使用术语查询。
  • 将运算符更改为“OR”,因为在这种情况下,它将返回多个条目,我不希望这样做。

  • 我做错了什么,如何通过修改查询来实现?

    最佳答案

    您已经配置了用于索引和搜索的不同分析器(index_name_analyzersearch_cross_fields_analyzer)。如果这些分析器以不兼容的方式处理输入的Dr. med. Elisabeth Bauer,则搜索将不匹配。在Index and search analysisControlling Analysis中对此进行了更详细的描述。
    您没有提供这两个分析器的定义,因此很难从您的问题中猜测它们的作用。根据分析仪的不同,可能可以在执行搜索之前对查询字符串进行预处理(例如,通过删除.),以使搜索匹配。
    您可以使用Testing analyzers中所述的_analyze API来调查分析如何影响搜索。对于您的示例,命令

    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
    }
    ]
    }
    对于上面的示例输出,分析器已将输入分为每个单词一个 token ,每个单词小写,并丢弃所有标点符号。
    我的猜测是 index_name_analyzer保留标点符号,而 search_cross_fields_analyzer丢弃标点符号,以便 token 不匹配。如果是这种情况,并且您无法更改索引配置(如您在问题中所述),则另一种选择是在运行查询时指定其他分析器:
    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)。哪种分析仪可能有意义,取决于您的设置。理想情况下,您应该将分析仪配置为对齐,以便不必在搜索时进行覆盖,但这听起来好像您并不生活在理想的世界中。

    关于elasticsearch - Elasticsearch:查询文档,字段中包含 “.”时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63901824/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com