【问题标题】:Turkish character problem in elasticsearchelasticsearch中的土耳其字符问题
【发布时间】:2021-03-29 10:59:46
【问题描述】:

当我在 elasticsearch 中搜索土耳其语字符时,它不匹配。例如,当我输入“yazilim”时,结果来了,但是当我输入“Yazılım”时,没有结果。正确的是“Yazılım”。

我的索引代码。

 var createIndexDescriptor = new CreateIndexDescriptor(INDEX_NAME).Mappings(ms => ms.Map<T>(m => m.AutoMap()
                  .Properties(pprops => pprops
                      .Text(ps => ps
                          .Name("Title")
                          .Fielddata(true)
                          .Fields(f => f
                              .Keyword(k => k
                                  .Name("keyword")))))
      )).Settings(st => st
          .Analysis(an => an
              .Analyzers(anz => anz
                  .Custom("tab_delim_analyzer", td => td
                      .Filters("lowercase", "asciifolding")
                      .Tokenizer("standard")
                  )
              )
          )
      );

我的搜索查询代码。

var searchResponse = eClient.Search<GlobalCompany>(s => s.Index(INDEX_NAME).From(0).Size(10)
                  .Query(q => q
                  .MultiMatch(m => m
                            .Fields(f => f
                             .Field(u => u.Title)
                             .Field(u => u.RegisterNumber))
                            .Type(TextQueryType.PhrasePrefix)
                          .Query(value))));

【问题讨论】:

标签: c# elasticsearch nest elasticsearch.net


【解决方案1】:

您正在使用 asciifolding 过滤器,它确保使用 ASCII 字符 (see docs)。

【讨论】:

  • “Latin Small Letter Dotless I”ı 和“Latin Capital Letter I with Dot Above”İ 都不是 ASCII 格式
【解决方案2】:

您需要将字段Title 配置为text 字段而不是keyword 字段,并将该字段的analyzer 设置为tab_delim_analyzer

我不知道如何在 dotNet 世界中翻译它,但这是我在纯 Kibana 开发控制台脚本 (curl) 中的意思:

DELETE deneme
PUT deneme
{
  "settings": {
    "analysis": {
      "analyzer": {
        "tab_delim_analyzer": {
          "type": "custom", 
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "asciifolding"
          ]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "Title": {
        "type": "text",
        "analyzer": "tab_delim_analyzer"
      }
    }
  }
}

【讨论】:

  • 我该怎么做?你能告诉我示例代码吗? @dadoonet
  • .Text(ps => ps .Name("Title") .Analyzer("tab_delim_tokenizer") .Fielddata(true) .Fields(f => f .Keyword(k => k .Name ("keyword") ) ) ) 如果这是你的意思,我试过了,但没用。 @dadoonet
  • 更新了一个例子。
  • { "error": { "root_cause": [ { "type": "resource_already_exists_exception", "reason": "index [deneme/gw1FUQ9RSDib7IhLSaOrVA] 已经存在", "index_uuid": "gw1FUQ9RSDib7IhLSaOrVA" ,“索引”:“deneme”}],“类型”:“resource_already_exists_exception”,“原因”:“索引 [deneme/gw1FUQ9RSDib7IhLSaOrVA] 已经存在”,“index_uuid”:“gw1FUQ9RSDib7IhLSaOrVA”,“索引”:“deneme”} , "status": 400 } 我遇到了这样的错误。
  • 我有一个名为 deneme 的索引。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-29
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多