更新以显示工作示例
我正在尝试对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<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; } }
任何提示将不胜感激。
从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" ] } } } }
注意事项
您需要添加mynGram到分析仪中,否则将无法使用。他们的工作方式就是这样。每个索引字段都应用了一个分析器,一个分析器是 一个 标记器,后跟 零个或多个 标记过滤器。您已经定义了一个不错的nGram标记生成器(mynGram)来使用,但是您没有在中使用它customAnalyzer,而是使用了standard标记生成器。(基本上,您只是在定义但从未使用过mynGram。)
mynGram
customAnalyzer
standard
您需要告诉elasticsearch customAnalyzer在您的映射中使用您的: "properties": {"string_field": {"type": "string", "index_analyzer": customAnalyzer" }}
"properties": {"string_field": {"type": "string", "index_analyzer": customAnalyzer" }}
您应该将更maxGram改为更大的数字(可能是10),否则4个字母的搜索将不会完全像自动完成一样(或可能不返回任何值,具体取决于搜索时间分析器)。
maxGram
使用_analyzeapi端点测试您的分析器。东西线这应该工作。
_analyze
curl -XGET’http: //yourserver.com :9200?index_name/_analyze?analyzer=customAnalyzer’-d’rlewis’
祝好运!