C# NEST ElasticSearch Default_Search analyzer

本文关键字:Search analyzer Default NEST ElasticSearch | 更新日期: 2023-09-27 18:37:15

简而言之,我希望能够拥有一个仅用于搜索的分析器。排序应按默认分析器进行。

通过添加此代码,我可以成功地使搜索按预期工作。当我搜索"be"时,我找到带有"Bé"的东西。

        var an = new CustomAnalyzer();
        an.Tokenizer = "keyword";
        an.Filter = new List<string>();
        an.Filter.Add("standard");
        an.Filter.Add("lowercase");
        an.Filter.Add("ascii_folding");
        return await CreateIndexAsync(c => c
            .Index(_index)
            .Analysis(a => a.Analyzers(a1 => a1.Add("default", an)))
            .Analysis(a => a.TokenFilters(tf => tf.Add("ascii_folding", new AsciiFoldingTokenFilter { PreserveOriginal = true })))
        );

这导致我的排序也变得 ascii 折叠。一个ÅB等

阅读这里,看起来我应该能够将我的分析器应用于仅搜索。https://www.elastic.co/guide/en/elasticsearch/reference/1.4/analysis-analyzers.html#default-analyzers

"default_search可用于配置仅在搜索时使用的默认分析器"

如果我理解正确,我应该能够通过更改此行来应用我的分析仪进行搜索。

            .Analysis(a => a.Analyzers(a1 => a1.Add("default_search", an)))

这完全破坏了分析仪。默认情况下,搜索将进行,并且不会命中 Bé。知道我在这里做错了什么吗?

这是我的要求

Request: {
  "from": 0,
  "size": 70,
  "_source": {
    "include": [
      "Name",
    ]
  },
  "query": {
    "bool": {
      "must": [
        {
          "wildcard": {
            "_all": {
              "value": "*be*"
            }
          }
        }
      ]
    }
  },
  "filter": {}
}

我在_all中使用通配符搜索应该没有任何问题?

这是一个带有排序的请求。问题是我在这里的结果按 ascii 折叠值排序(如果我使用默认分析器)

    Request: {
  "from": 0,
  "size": 70,
  "sort": [
    {
      "Name": {
        "order": "asc"
      }
    }
  ],
  "_source": {
    "include": [
      "Name"
    ]
  }
}

C# NEST ElasticSearch Default_Search analyzer

如果您总是在_all字段上执行搜索,则可以为此设置不同的分析器。

创建两个分析器,

一个标准分析器,一个带ascii_folding分析器。

var allAnalyzer = new CustomAnalyzer();
allAnalyzer.Tokenizer = "keyword";
allAnalyzer.Filter.Add("customasciifolding");
var defAnalyzer= new CustomAnalyzer();
defAnalyzer.Tokenizer = "keyword";
defAnalyzer.Filter = new List<string>();
defAnalyzer.Filter.Add("standard");

使用分析器创建索引。

return await CreateIndexAsync(c => c
            .Index(_index)
            .Analysis(a => a
                .Analyzers(a1 => a1
                    .Add("default", defAnalyzer)
                    .Add("customAll",allAnalyzer)
                )
                .TokenFilters(tf => tf.Add("customasciifolding", new AsciiFoldingTokenFilter { PreserveOriginal = true })
                )
            )
        );

然后,当您映射时,请按如下方式进行设置

await _elasticClient.MapAsync<MyClass>(m => m
            .MapFromAttributes()
            .AllField(af => af.Analyzer("customAll"))
        );

我了解,您需要应用排序,因为现在您的排序是基于_score。因此,您的查询是按通配符过滤的,然后取决于分数(找到匹配的位置和频率)对结果进行排序

.Analysis(a => a.Analyzers(a1 => a1.Add("default_search", an)))

您可以这样做,因此将其设置为带有ascii过滤器的默认分析器

附言。问题更新后。您应该使用多字段,因此您应该有一个未分析的分析字段。搜索分析,排序未分析