为弹性搜索指定和使用带有 C# NEST 客户端的 NGramTokenizer

Posted

技术标签:

【中文标题】为弹性搜索指定和使用带有 C# NEST 客户端的 NGramTokenizer【英文标题】:Specifying and using a NGramTokenizer with the C# NEST client for Elastic Search 【发布时间】:2013-07-31 03:16:22 【问题描述】:

更新为显示工作示例

我正在尝试对 ElasticSearch 中的用户名集合进行部分搜索。

四处搜索已将我指向nGram Tokenizer 方向,但我对正确实施感到困惑,未能得到任何结果。

这是从我正在处理的项目中剥离的相关代码。

我尝试了不同的组合和搜索类型,但无济于事。

setup.cs

var client = new ElasticClient(settings.ConnectionSettings);

// (Try and) Setup the nGram tokenizer.
var indexSettings = new IndexSettings();
var custonAnalyzer = new CustomAnalyzer();

customAnalyzer.Tokenizer = "mynGram";
customAnalyzer.Filter = new List<string>  "lowercase" ;

indexSettings.Analysis.Analyzers.Add("mynGram", customAnalyzer);

indexSettings.Analysis.Tokenizers.Add("mynGram", new NGramTokenizer
                                                    
                                                        MaxGram = 10,
                                                        MinGram = 2
                                                    );

client.CreateIndex(settings.ConnectionSettings.DefaultIndex, indexSettings);

client.MapFromAttributes<Profile>();

// Create and add a new profile object.
var profile = new Profile
                  
                      Id = "1",
                      Username = "Russell"
                  ;


client.IndexAsync(profile);

// Do search for object
var s = new SearchDescriptor<Profile>().Query(t => t.Term(c => c.Username, "russ"));

var results = client.Search<Profile>(s);

Profile.cs

public class Profile

    public string Id  get; set; 

    [ElasticProperty(IndexAnalyzer = "mynGram")]
    public string Username  get; set; 

任何提示将不胜感激。

【问题讨论】:

【参考方案1】:

看看这个来自the es docs on nGram token filters:

    "settings" : 
        "analysis" : 
            "analyzer" : 
                "my_ngram_analyzer" : 
                    "tokenizer" : "my_ngram_tokenizer"
                
            ,
            "tokenizer" : 
                "my_ngram_tokenizer" : 
                    "type" : "nGram",
                    "min_gram" : "2",
                    "max_gram" : "3",
                    "token_chars": [ "letter", "digit" ]
                
            
        
    

注意事项

    您需要将mynGram 添加到您的分析仪,否则将无法使用。他们的工作方式是这样的。每个索引字段都应用了一个分析器,一个分析器是一个标记器,后跟零个或多个标记过滤器。您已经定义了一个不错的 nGram 标记器 (mynGram) 来使用,但您没有在 customAnalyzer 中使用它,它正在使用 standard 标记器。 (基本上你只是在定义但从不使用mynGram。)

    你需要告诉 elasticsearch 在你的映射中使用你的customAnalyzer"properties": "string_field": "type": "string", "index_analyzer": customAnalyzer"

    您应该将 maxGram 更改为更大的数字(可能是 10),否则 4 个字母的搜索将不会完全像自动完成一样(或者不会返回任何内容,取决于搜索时间分析器)。

    使用_analyze api 端点来测试您的分析器。这应该行得通。

    curl -XGET 'http://yourserver.com:9200?index_name/_analyze?analyzer=customAnalyzer' -d 'rlewis'

祝你好运!

【讨论】:

它就像魔法一样起作用。我将更新示例以显示固定版本以供将来参考。感谢您的指导。

以上是关于为弹性搜索指定和使用带有 C# NEST 客户端的 NGramTokenizer的主要内容,如果未能解决你的问题,请参考以下文章

Nest Client c# 7.0 用于弹性搜索删除别名

使用 NEST 字段提升的弹性搜索

NEST 中的模拟 Elasticsearch 客户端存在异步搜索方法问题

将对象序列化为 JSON,然后使用 NEST 在弹性搜索中发送查询

如何使用 Nest 客户端将日期范围应用于聚合查询

NEST 搜索整个文档 C# Elasticsearch