我如何索引单词,例如Elasticsearch中的L'Oréal?

用户可以通过两种方式输入:

  • Loreal
  • 欧莱雅
  • 欧莱雅

  • 理想情况下,我希望它们全部输出loreal。我不想为每个特殊关键字手动执行此操作。

    Elision Token Filter似乎很有用,但仅适用于第二和第三种情况。

    任何想法,我将如何使所有这些关键字输出相同的标记loreal

    最佳答案

    省略 token 过滤器实际上会删除指定的文章,因此您的 token 中永远不会包含loreal,即第一个l永远不会包含它。

    我的建议是结合使用asciifoldinglowercase进行以下操作:

    PUT test_index
    {
       "settings": {
          "analysis": {
             "analyzer": {
                "my_analyzer": {
                   "tokenizer": "standard",
                   "filter": [
                      "standard",
                      "asciifolding",
                      "lowercase"
                   ],
                   "char_filter": [
                      "apostrophe"
                   ]
                }
             },
             "char_filter": {
                "apostrophe": {
                   "type": "mapping",
                   "mappings": [
                      "'=>"
                   ]
                }
             }
          }
       }
    }
    

    使用my_analyzer,您指定的所有输入字符串将转换为loreal token 。
    curl -XGET 'localhost:9200/test_index/_analyze?analyzer=my_analyzer&pretty' -d "Loreal"
    => loreal
    
    curl -XGET 'localhost:9200/test_index/_analyze?analyzer=my_analyzer&pretty' -d "L'Oreal"
    => loreal
    
    curl -XGET 'localhost:9200/test_index/_analyze?analyzer=my_analyzer&pretty' -d "L'Oréal"
    => loreal
    

    08-28 13:31