0

当我在 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))));
4

2 回答 2

0

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

我不知道如何在 dotNet 世界中翻译它,但这是我在纯 Kibana Dev Console 脚本(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"
      }
    }
  }
}
于 2021-03-29T13:29:53.747 回答
0

您正在使用asciifolding过滤器,它确保使用 ASCII 字符(请参阅文档)。

于 2021-03-29T11:15:18.883 回答