c# - C#NEST ElasticSearch Default_Search分析器

标签 c# search elasticsearch default nest

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

通过添加此代码,我可以成功地按预期进行搜索。当我搜索“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"
    ]
  }
}

最佳答案

如果您始终在_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 })
                )
            )
        );

然后,当您进行 map 设置时,如下所示
await _elasticClient.MapAsync<MyClass>(m => m
            .MapFromAttributes()
            .AllField(af => af.Analyzer("customAll"))
        );

关于c# - C#NEST ElasticSearch Default_Search分析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35774894/

相关文章:

C# 从 Cosmos db 获取带有数组的 json

c# - 如何在 wpf c# visual studio 中对标签或文本 block 使用点击事件?

java - 我需要规范化这个 MySQL 数据库吗?

elasticsearch - Elasticsearch : how to get all data of specific field

java - 找出与自定义评分脚本中的术语匹配的字段

c# - 通过 ASP.NET 将 PRIMARY Key 值插入 SQL 而不复制 CHAR

C# 拖放 - 使用基类的 e.Data.GetData

php - 使用 PDO 进行 MySQL 搜索查询并显示结果列表

php - Mongodb 嵌套数组搜索

html - 我可以更改顶部菜单栏并删除 kibana-4 中的一些选项吗