为Elastic Search指定和使用带有C#NEST客户端的NGramTokenizer

RLe*_*wis 6 c# elasticsearch nest

更新以显示工作样本

我试图在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);
Run Code Online (Sandbox Code Playgroud)

Profile.cs

public class Profile
{
    public string Id { get; set; }

    [ElasticProperty(IndexAnalyzer = "mynGram")]
    public string Username { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

任何提示将非常感激.

ram*_*laf 4

从nGram 令牌过滤器的 es 文档中看一下:

    "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" ]
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

有几点需要注意

  1. 您需要添加mynGram到您的分析器中,否则它将不会被使用。他们的工作方式是这样的。每个索引字段都有一个应用于其的分析器,分析器是一个分词器,后跟零个或多个分词过滤器。您已经定义了一个很好的 nGram tokenizer ( mynGram) 来使用,但您没有在 中使用它customAnalyzer,它正在使用standardtokenizer。(基本上你只是定义但从未使用mynGram。)

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

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

  4. 使用_analyzeapi 端点来测试您的分析器。这应该可以工作。

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

祝你好运!