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

更新以显示工作样本

我试图在ElasticSearch中对一组用户名进行部分搜索。

搜索周围已经指出我在nGram Tokenizer方向,但我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 { "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(); // 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().Query(t => t.Term(c => c.Username, "russ")); var results = client.Search(s); 

Profile.cs

 public class Profile { public string Id { get; set; } [ElasticProperty(IndexAnalyzer = "mynGram")] public string Username { get; set; } } 

任何提示将不胜感激。

从nGram令牌filter上的es docs看一下这个:

  "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" ] } } } } 

有几点需要注意

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

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

  3. 你应该将maxGram更改为更大的数字(可能是10),否则4个字母的搜索将不会完全像自动完成(或者什么都不返回,取决于搜索时间分析器)。

  4. 使用_analyze api端点来测试您的分析仪。 这条线应该有效。

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

祝好运!