已更新以显示正在运行的示例
我正在尝试对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; }
}
任何提示都会非常感激。
答案 0 :(得分:3)
从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
添加到分析仪中,否则将无法使用。{li>
他们的工作方式是这样的。每个索引字段都应用了一个分析器,分析器是一个标记生成器,后跟零个或多个标记过滤器。您已定义了一个不错的nGram标记器(mynGram
),但您没有在customAnalyzer
中使用它,它正在使用standard
标记生成器。 (基本上你只是定义但从不使用mynGram
。)
您需要告诉elasticsearch在您的映射中使用customAnalyzer
:
"properties": {"string_field": {"type": "string", "index_analyzer": customAnalyzer" }}
您应该将maxGram
更改为更大的数字(可能是10),否则4个字母的搜索将不会完全像自动完成(或者什么都不返回,取决于搜索时间分析器)。< / p>
使用_analyze
api端点测试您的分析仪。这应该有效。
curl -XGET'http://yourserver.com:9200?index_name/_analyze?analyzer=customAnalyzer'-d'rlewis'