无法处理Elasticsearch索引和搜索中的重音

时间:2017-06-04 11:53:12

标签: elasticsearch

我遇到了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
}

然后我根本没有结果。

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

2 个答案:

答案 0 :(得分:0)

Prefix Query中,您的搜索输入不会像其他情况一样进行分析:

  

匹配包含具有指定前缀的字词的字段(未分析

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

您的第二个示例不起作用,因为这些文档不包含以pereuil开头的任何字词。

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

  1. 要求Elastisearch分析您的输入,并调用Analyze API
  2. 使用步骤1的输出(示例中应为pér)作为前缀查询
  3. 为了实现这一目标,您的搜索输入应该是单个术语(我认为这可能是Elasticsearch首先不想分析它的原因)

答案 1 :(得分:0)

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

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

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

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