为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" ] } } } }
有几点需要注意
-
您需要将
mynGram
添加到您的分析仪中,否则它将不会被使用。 他们的工作方式是这样的。 每个索引字段都应用了一个分析器,分析器是一个标记化器,后跟零个或多个标记filter。 你已经定义了一个很好用的nGram tokenizer(mynGram
),但你没有在customAnalyzer
使用它,它使用的是standard
tokenizer。 (基本上你只是定义但从不使用mynGram
。) -
你需要告诉
customAnalyzer
在你的映射中使用你的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’
祝好运!