使用NEST c#客户端进行ElasticSearch重音不敏感查询
本文关键字:查询 ElasticSearch NEST 客户端 使用 | 更新日期: 2023-09-27 18:11:46
我试图用NEST c#客户端在ElasticSearch中查询一个没有重音的查询,我的数据有葡萄牙语拉丁单词重音。请看下面的代码:
var result = client.Search<Book>(s => s
.From(0)
.Size(20)
.Fields(f => f.Title)
.FacetTerm(f => f.OnField(of => of.Genre))
.Query(q => q.QueryString(qs => qs.Query("sao")))
);
这个搜索没有找到任何东西。我在这个索引上的数据包含许多标题,如:" s
var settings = new IndexSettings();
settings.NumberOfReplicas = 1;
settings.NumberOfShards = 5;
settings.Analysis.Analyzers.Add("snowball", new Nest.SnowballAnalyzer { Language = "Portuguese" });
var idx5 = client.CreateIndex("idx5", settings);
如何使用ElasticSearch查询"sao"并找到" s
我认为必须创建具有正确属性的索引,但我已经尝试了许多设置,如。
或Raw模式下:
<>之前{"idx": {"settings": {"index. analyze .filter.jus_stemmer.name": "brazilian","index.analysis.filter.jus_stop。_lang_": "巴西人"}}}>之前如何进行搜索并忽略重音?
谢谢朋友,
查看解决方案:
使用putty连接elasticsearch搜索:
curl -XPOST 'localhost:9200/idx30/_close'
curl -XPUT 'localhost:9200/idx30/_settings' -d '{
"index.analysis.analyzer.default.filter.0": "standard",
"index.analysis.analyzer.default.tokenizer": "standard",
"index.analysis.analyzer.default.filter.1": "lowercase",
"index.analysis.analyzer.default.filter.2": "stop",
"index.analysis.analyzer.default.filter.3": "asciifolding",
"index.number_of_replicas": "1"
}'
curl -XPOST 'localhost:9200/idx30/_open'
将"idx30"替换为索引名称
完成了!
我偶然发现了这个线程,因为我得到了同样的问题。下面是用ascii格式分析器创建索引的代码:
// Create the Client
string indexName = "testindex";
var uri = new Uri("http://localhost:9200");
var settings = new ConnectionSettings(uri).SetDefaultIndex(indexName);
var client = new ElasticClient(settings);
// Create new Index Settings
IndexSettings set = new IndexSettings();
// Create a Custom Analyzer ...
var an = new CustomAnalyzer();
// ... based on the standard Tokenizer
an.Tokenizer = "standard";
// ... with Filters from the StandardAnalyzer
an.Filter = new List<string>();
an.Filter.Add("standard");
an.Filter.Add("lowercase");
an.Filter.Add("stop");
// ... just adding the additional AsciiFoldingFilter at the end
an.Filter.Add("asciifolding");
// Add the Analyzer with a name
set.Analysis.Analyzers.Add("nospecialchars", an);
// Create the Index
client.CreateIndex(indexName, set);
现在你可以将你的实体映射到这个索引(在创建索引之后做这个很重要)
client.MapFromAttributes<TestEntity>();
这样的实体应该是这样的:
[ElasticType(Name = "TestEntity", DisableAllField = true)]
public class TestEntity
{
public TestEntity(int id, string desc)
{
ID = id;
Description = desc;
}
public int ID { get; set; }
[ElasticProperty(Analyzer = "nospecialchars")]
public string Description { get; set; }
}
好了,Description-Field现在被插入到没有重音的索引中。您可以通过检查索引的映射来测试这一点:
http://localhost:9200/testindex/_mapping
应该看起来像这样:
{
testindex: {
TestEntity: {
_all: {
enabled: false
},
properties: {
description: {
type: "string",
analyzer: "nospecialchars"
},
iD: {
type: "integer"
}
}
}
}
}
希望对大家有所帮助
您需要将ACSII折叠过滤器合并到您的分析器中来完成此操作。这将意味着构建滚雪球分析器表单标记器和过滤器(除非nest
允许您向非自定义分析器添加过滤器)。然而,据我所知,ElasticSearch没有)。
SnowballAnalyzer包含:
- StandardTokenizer
- StandardFilter
- (此处添加ascii折叠过滤器)
- LowercaseFilter
- StopFilter(带有适当的停止字设置)
- SnowballFilter(带有适当的语言)
- (或者这里)
我可能会尝试在LowercaseFilter之前添加ASCIIFoldingFilter
,尽管在最后一步(在SnowballFilter之后)添加它可能会更好。两种方法都试一试,看看哪种效果更好。我对这两种葡萄牙语的词根都不太了解,无法确定哪个是最好的。