弹性搜索 - 如何使用UTF-8过滤器的语言分析器?

时间:2017-03-14 13:23:34

标签: elasticsearch elasticsearch-5 elasticsearch-dsl

我的ElasticSearch语言分析器有问题。我正在研究立陶宛语,所以我使用立陶宛语语言分析器。分析器工作正常,我得到了我需要的所有单词案例。例如,我索引立陶宛城市“Klaipėda”:

show()

问题是我还需要得到一个结果,当我在拉丁字母(“克莱佩达”)和所有立陶宛案例中搜索“Klaipėda”时:

  1. Nomanitive案件:“Klaipeda”
  2. Genitive case:“Klaipedos”
  3. ...
  4. 定位案例:“Klaipedoje”
  5. “Klaipėda”,“Klaipėdos”,“Klaipėdoje” - 作品,但“Klaipeda”,“Klaipedos”,“Klaipedoje” - 不是。

    我的索引:

    PUT /cities/city/1
    {
      "name": "Klaipėda"
    }
    

    和搜索查询:

    PUT /cities
    {
      "mappings": {
        "city": {
          "properties": {
            "name": {
              "type":     "string",
              "analyzer": "lithuanian",
                "fields": {
                  "folded": {
                  "type": "string",
                  "analyzer": "md_folded_analyzer"
                 }
               }
            }
          }
        }
      },
      "settings": {
          "analysis": {
            "analyzer": {
              "md_folded_analyzer": {
                "type": "lithuanian",
                "tokenizer": "standard",
                "filter":  [ 
                  "lowercase", 
                  "asciifolding",
                  "lithuanian_stop",
                  "lithuanian_keywords",
                  "lithuanian_stemmer"
                ]
              }
            }
         }
      }
    }
    

    我做错了什么?谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

您在这里使用的技术是所谓的multi-fields。基础name.folded字段的限制是您无法对其执行搜索 - 您只能按name.folded和聚合执行排序。

为了解决这个问题,我想出了以下设置:

  1. 单独设置字段(以消除重复项 - 只需指定copy_to):

    curl -XPUT http://localhost:9200/cities -d '
    {
      "mappings": {
        "city": {
          "properties": {
            "name": {
              "type":     "string",
              "analyzer": "lithuanian",
              "copy_to": "folded",
            },
            "folded": {
              "type": "string",
              "analyzer": "md_folded_analyzer"
            }
          }
        }
      }
    }'
    
  2. 如同here所述,将分析器的类型更改为custom,否则asciifolding不会进入配置。更重要的是 - asciifolding应该用立陶宛语中的所有词干/停止词语,因为折叠后的词语可能会错过理想的感觉。

    curl -XPUT http://localhost:9200/my_cities -d '
    {
      "settings": {
          "analysis": {
            "filter": {
              "lithuanian_stop": {
                "type":       "stop",
                "stopwords":  "_lithuanian_"
              },
              "lithuanian_stemmer": {
                "type":       "stemmer",
                "language":   "lithuanian"
              }
            },
            "analyzer": {
              "md_folded_analyzer": {
                "type": "custom",
                "tokenizer": "standard",
                "filter":  [
                  "lowercase",
                  "lithuanian_stop",
                  "lithuanian_stemmer",
                  "asciifolding"
                ]
              }
            }
         }
      }
    }
    

    抱歉,我已经取消lithuanian_keywords - 它需要额外的设置,我在这里错过了。但我希望你有这个想法。