【问题标题】:Can't deal with accents in Elasticsearch indexing and search无法处理 Elasticsearch 索引和搜索中的重音符号
【发布时间】:2017-06-04 11:53:12
【问题描述】:

我对 elasticsearch 和数据的索引/检索方式有疑问。我不明白会发生什么。

这是我使用的映射(抱歉,它是 yaml 格式): 从理论上讲,这个想法很简单......我有一个带有小写和 asciifolding 过滤器的字符串分析器。我不想关心大小写或重音,我想使用这个分析器来索引和搜索。

settings:
    index:
        analysis:
            filter:
                autocomplete_filter:
                    type: edgeNGram
                    side: front
                    min_gram: 1
                    max_gram: 20
            analyzer:
                autocomplete:
                    type: custom
                    tokenizer: standard
                    filter: [lowercase, asciifolding, autocomplete_filter]
                string_analyzer:
                    type:        custom
                    tokenizer:   standard
                    filter:      [lowercase, asciifolding]
types:
    city:
        mappings:
            cityName:
                type: string
                analyzer: string_analyzer
                search_analyzer: string_analyzer
            location: {type: geo_point}

当我运行这个查询时:

{
    "query": {
        "prefix":{
            "cityName":"per"
        }
    }
    ,
    "size":20
}

我得到一些结果,例如“Perpezat”、“Pern”、“Péreuil”,这是例外结果。

但如果我运行以下查询:

{
    "query": {
        "prefix":{
            "cityName":"pér"
        }
    }
    ,
    "size":20
}

然后我根本没有得到任何结果。

如果您有任何线索或帮助,我很乐意知道。 谢谢

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    在Prefix Query 中,您的搜索输入不会像其他情况那样被分析:

    匹配具有包含具有指定前缀的术语的字段的文档(未分析)

    您的第一个示例有效,因为文档在索引时使用您的小写和 asciifolding 分析器进行分析,因此它们包含以 per 开头的术语(perpezat、pern、pereuil)。

    您的第二个示例不起作用,因为这些文档不包含任何以 pér 开头的术语。

    由于我找不到方法告诉 Elasticsearch 在执行搜索之前分析前缀,您可以通过手动添加此步骤来实现您的目标:

    1. 请 Elastisearch 分析您的输入,调用 Analyze API
    2. 使用第 1 步的输出(在示例中应该是 per)作为前缀查询

    为此,您的搜索输入应该是一个词(我认为这可能是 Elasticsearch 不想首先分析它的原因)

    【讨论】:

    • 谢谢,我明白了。我也尝试过匹配查询、通配符(我认为它类似于前缀)和字符串查询。无论查询什么,我只想检索“以 * 开头的名称”
    • @billy59 匹配查询应返回“Perpezat”、“Pern”、“Péreuil”,您也使用“pér”作为输入,但它返回包含该术语的所有内容,而不仅仅是以开头。您打算尝试我建议的手动方法吗?
    • 应该返回 "Perpezat", "Pern", "Péreuil" 并且你使用 "pér" 作为输入 > 实际上,它没有。那就是问题所在。是的,如果它是唯一的解决方案,我将尝试调用分析器 API。我只是想知道我是不是做错了什么
    • @billy59 很奇怪.. 我真的希望GET /_search { "query": { "match" : { "cityName" : "pér" } } } 能够工作(除了前缀部分)。可能还有其他问题,例如在索引文档之后创建的映射(它总是需要在之前完成)
    • 实际上经过测试,"query": { "match" : { "cityName" : "per"}} 也没有返回任何结果。我的映射可能有问题
    【解决方案2】:

    @mario-trucco 最后,我发现这篇文章解释了分析字符串的更好方法。

    What is an effective way to search world-wide location names with ElasticSearch?

    当然它没有回答我最初的问题,我仍然不明白发生了什么,但它通过删除它解决了我的问题。

    再次感谢您的帮助和时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-09
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-18
      相关资源
      最近更新 更多