gpt4 book ai didi

c# - 指定 NGramTokenizer 并将其与用于 Elastic Search 的 C# NEST 客户端一起使用

转载 作者:太空狗 更新时间:2023-10-29 21:50:37 26 4
gpt4 key购买 nike

已更新以显示工作示例

我正在尝试对 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; }
}

如有任何提示,我们将不胜感激。

最佳答案

看看这个来自 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" ]
}
}
}
}

注意事项

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

  2. 您需要告诉 elasticsearch 在您的映射中使用您的 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'

祝你好运!

关于c# - 指定 NGramTokenizer 并将其与用于 Elastic Search 的 C# NEST 客户端一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17960966/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com