在elasticsearch中使用asciifolding和utf-8字符进行搜索

she*_*per 3 elasticsearch

我正在索引网页上的所有名称,其中包含带有"José"等重音的字符.我希望能够用"Jose"和"José"搜索这个名字.

如何为具有一个字段"name"的简单索引设置索引映射和分析器?

我为名称字段设置了一个分析器,如下所示:

"analyzer": {
  "folding": {
    "tokenizer": "standard",
    "filter": ["lowercase", "asciifolding"]
   }
 }
Run Code Online (Sandbox Code Playgroud)

但它将所有重音折叠成ascii等效物,并在索引"é"时忽略重音.我希望"é"字符在索引中,我希望能够用"José"或"Jose"搜索"José"

谢谢

Val*_*Val 5

您需要使用重音保留原始令牌.要实现这一点,您需要重新定义自己的asciifolding令牌过滤器,如下所示:

PUT /my_index
{
    "settings" : {
        "analysis" : {
            "analyzer" : {
                "folding" : {
                    "tokenizer" : "standard",
                    "filter" : ["lowercase", "my_ascii_folding"]
                }
            },
            "filter" : {
                "my_ascii_folding" : {
                    "type" : "asciifolding",
                    "preserve_original" : true
                }
            }
        }
    },
    "mappings": {
        "my_type": {
            "properties": {
                "name": {
                    "type": "text",
                    "analyzer": "folding"
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在那之后,两个标记josejosé将被索引和搜索