为弹性搜索指定和使用带有 C# NEST 客户端的 NGramTokenizer
Posted
技术标签:
【中文标题】为弹性搜索指定和使用带有 C# NEST 客户端的 NGramTokenizer【英文标题】:Specifying and using a NGramTokenizer with the C# NEST client for Elastic Search 【发布时间】:2013-07-31 03:16:22 【问题描述】:更新为显示工作示例
我正在尝试对 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;
任何提示将不胜感激。
【问题讨论】:
【参考方案1】:看看这个来自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
添加到您的分析仪,否则将无法使用。他们的工作方式是这样的。每个索引字段都应用了一个分析器,一个分析器是一个标记器,后跟零个或多个标记过滤器。您已经定义了一个不错的 nGram 标记器 (mynGram
) 来使用,但您没有在 customAnalyzer
中使用它,它正在使用 standard
标记器。 (基本上你只是在定义但从不使用mynGram
。)
你需要告诉 elasticsearch 在你的映射中使用你的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'
祝你好运!
【讨论】:
它就像魔法一样起作用。我将更新示例以显示固定版本以供将来参考。感谢您的指导。以上是关于为弹性搜索指定和使用带有 C# NEST 客户端的 NGramTokenizer的主要内容,如果未能解决你的问题,请参考以下文章
NEST 中的模拟 Elasticsearch 客户端存在异步搜索方法问题