如何使用 Nest 将具有数组值的设置 属性 添加到 ES-index
How to add settings property with array value to ES-index using Nest
“我正在尝试使用 ElasticSearch 及其 NEST .NET 客户端为自动完成搜索创建索引。我正在按照 http://qbox.io/blog/an-introduction-to-ngrams-in-elasticsearch 上的教程进行操作,但在创建时遇到了 运行 问题索引及其设置。具体来说,我想使用以下设置创建索引(直接从教程的 TL;DR 开始):
PUT /test_index
{
"settings": {
"analysis": {
"filter": {
"edge_ngram_filter": {
"type": "edge_ngram",
"min_gram": 2,
"max_gram": 20
}
},
"analyzer": {
"edge_ngram_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"edge_ngram_filter"
]
}
}
}
}
我的问题是我不知道如何使用 NEST 发送 "filter": [ "lowercase", "edge_ngram_filter" ]
部分。我目前的尝试是这样的:
esclient.CreateIndex("test_index", s => s
.Settings(settings => settings
.Add("analysis.filter.edge_ngram_filter.type", "edge_ngram")
.Add("analysis.filter.edge_ngram_filter.min_gram", "2")
.Add("analysis.filter.edge_ngram_filter.max_gram", "20")
.Add("analysis.analyzer.edge_ngram_analyzer.type", "custom")
.Add("analysis.analyzer.edge_ngram_analyzer.tokenizer", "standard")
// Interesting part on the line below!
.Add("analysis.analyzer.edge_ngram_analyzer.filter", new string[] { "lowercase", "edge_ngram_filter" })
)
);
但这失败并出现 JsonWriterException:"Unsupported type: System.String[]. Use the JsonSerializer class to get the object's JSON representation. Path 'settings.index'."。我试图简单地手动提供 JSON 数组 (.Add("analysis.analyzer.edge_ngram_analyzer.filter", "[ \"lowercase\", "\edge_ngram_analyzer\" ]")
) JSON 而是作为字符串转义。
NEST API 是否提供了这样做的方法?
UpdateSettings(..)
有更令人愉快的语法来设置分析设置。
您可以这样处理您的案件:
client.UpdateSettings(s => s
.Index(indexName)
.Analysis(a => a
.TokenFilters(f => f.Add("edge_ngram_filter", new EdgeNGramTokenFilter
{
MinGram = 2,
MaxGram = 20
}))
.Analyzers(analyzer => analyzer.Add("edge_ngram_analyzer", new CustomAnalyzer
{
Tokenizer = "standard",
Filter = new List<string> {"lowercase", "edge_ngram_filter"}
}))));
记得在更新索引设置之前关闭索引。
希望对您有所帮助。
更新:
您也可以在创建索引时实现这一点。无需更新设置。
client.CreateIndex(indexName, i => i
.Analysis(a => a
.TokenFilters(f => f.Add("edge_ngram_filter", new EdgeNGramTokenFilter
{
MinGram = 2,
MaxGram = 20
}))
.Analyzers(analyzer => analyzer.Add("edge_ngram_analyzer", new CustomAnalyzer
{
Tokenizer = "standard",
Filter = new List<string> {"lowercase", "edge_ngram_filter"}
}))));
“我正在尝试使用 ElasticSearch 及其 NEST .NET 客户端为自动完成搜索创建索引。我正在按照 http://qbox.io/blog/an-introduction-to-ngrams-in-elasticsearch 上的教程进行操作,但在创建时遇到了 运行 问题索引及其设置。具体来说,我想使用以下设置创建索引(直接从教程的 TL;DR 开始):
PUT /test_index
{
"settings": {
"analysis": {
"filter": {
"edge_ngram_filter": {
"type": "edge_ngram",
"min_gram": 2,
"max_gram": 20
}
},
"analyzer": {
"edge_ngram_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"edge_ngram_filter"
]
}
}
}
}
我的问题是我不知道如何使用 NEST 发送 "filter": [ "lowercase", "edge_ngram_filter" ]
部分。我目前的尝试是这样的:
esclient.CreateIndex("test_index", s => s
.Settings(settings => settings
.Add("analysis.filter.edge_ngram_filter.type", "edge_ngram")
.Add("analysis.filter.edge_ngram_filter.min_gram", "2")
.Add("analysis.filter.edge_ngram_filter.max_gram", "20")
.Add("analysis.analyzer.edge_ngram_analyzer.type", "custom")
.Add("analysis.analyzer.edge_ngram_analyzer.tokenizer", "standard")
// Interesting part on the line below!
.Add("analysis.analyzer.edge_ngram_analyzer.filter", new string[] { "lowercase", "edge_ngram_filter" })
)
);
但这失败并出现 JsonWriterException:"Unsupported type: System.String[]. Use the JsonSerializer class to get the object's JSON representation. Path 'settings.index'."。我试图简单地手动提供 JSON 数组 (.Add("analysis.analyzer.edge_ngram_analyzer.filter", "[ \"lowercase\", "\edge_ngram_analyzer\" ]")
) JSON 而是作为字符串转义。
NEST API 是否提供了这样做的方法?
UpdateSettings(..)
有更令人愉快的语法来设置分析设置。
您可以这样处理您的案件:
client.UpdateSettings(s => s
.Index(indexName)
.Analysis(a => a
.TokenFilters(f => f.Add("edge_ngram_filter", new EdgeNGramTokenFilter
{
MinGram = 2,
MaxGram = 20
}))
.Analyzers(analyzer => analyzer.Add("edge_ngram_analyzer", new CustomAnalyzer
{
Tokenizer = "standard",
Filter = new List<string> {"lowercase", "edge_ngram_filter"}
}))));
记得在更新索引设置之前关闭索引。
希望对您有所帮助。
更新:
您也可以在创建索引时实现这一点。无需更新设置。
client.CreateIndex(indexName, i => i
.Analysis(a => a
.TokenFilters(f => f.Add("edge_ngram_filter", new EdgeNGramTokenFilter
{
MinGram = 2,
MaxGram = 20
}))
.Analyzers(analyzer => analyzer.Add("edge_ngram_analyzer", new CustomAnalyzer
{
Tokenizer = "standard",
Filter = new List<string> {"lowercase", "edge_ngram_filter"}
}))));