C# NEST ElasticSearch Default_Search 分析器
C# NEST ElasticSearch Default_Search analyzer
总之我希望能够有一个只用于搜索的分析器。排序应该由默认分析器进行。
通过添加此代码,我可以成功地按预期进行搜索。当我搜索 "be" 时,我找到了带有 "Bé".
的内容
var an = new CustomAnalyzer();
an.Tokenizer = "keyword";
an.Filter = new List<string>();
an.Filter.Add("standard");
an.Filter.Add("lowercase");
an.Filter.Add("ascii_folding");
return await CreateIndexAsync(c => c
.Index(_index)
.Analysis(a => a.Analyzers(a1 => a1.Add("default", an)))
.Analysis(a => a.TokenFilters(tf => tf.Add("ascii_folding", new AsciiFoldingTokenFilter { PreserveOriginal = true })))
);
这导致我的排序也变成了 ascii 折叠。
一种
一种
B等等等等
阅读此处看来我应该能够将我的分析器应用于仅搜索。
https://www.elastic.co/guide/en/elasticsearch/reference/1.4/analysis-analyzers.html#default-analyzers
"and the default_search can be used to configure a default analyzer that will be used just when searching"
如果我理解正确,我应该能够将我的分析器应用于仅通过更改此行进行搜索。
.Analysis(a => a.Analyzers(a1 => a1.Add("default_search", an)))
这完全破坏了分析器。搜索将默认进行,并且不会点击 Bé。知道我在这里做错了什么吗?
这是我的要求
Request: {
"from": 0,
"size": 70,
"_source": {
"include": [
"Name",
]
},
"query": {
"bool": {
"must": [
{
"wildcard": {
"_all": {
"value": "*be*"
}
}
}
]
}
},
"filter": {}
}
我在 _all 中使用通配符搜索应该没有问题吧?
这是一个带排序的请求。问题是我这里的结果按 ascii 折叠值排序(如果我使用默认分析器)
Request: {
"from": 0,
"size": 70,
"sort": [
{
"Name": {
"order": "asc"
}
}
],
"_source": {
"include": [
"Name"
]
}
}
据我了解,您需要申请 sorting, because right now you sorting is based on _score。
所以你的查询是按通配符过滤的,然后取决于分数(找到匹配项的位置和频率)结果排序
.Analysis(a => a.Analyzers(a1 => a1.Add("default_search", an)))
您可以这样做,这样您就可以将其设置为带有 ascii 过滤器的默认分析器
PS。问题更新后。
您应该使用 multifield 这样您就应该有一个已分析的字段,一个未分析的字段。按已分析搜索,按未分析排序
如果您总是在 _all 字段上执行搜索,您可以为此设置一个不同的分析器。
创建两台分析仪,一台是标准的,一台是 ascii_folding。
var allAnalyzer = new CustomAnalyzer();
allAnalyzer.Tokenizer = "keyword";
allAnalyzer.Filter.Add("customasciifolding");
var defAnalyzer= new CustomAnalyzer();
defAnalyzer.Tokenizer = "keyword";
defAnalyzer.Filter = new List<string>();
defAnalyzer.Filter.Add("standard");
使用您的分析器创建索引。
return await CreateIndexAsync(c => c
.Index(_index)
.Analysis(a => a
.Analyzers(a1 => a1
.Add("default", defAnalyzer)
.Add("customAll",allAnalyzer)
)
.TokenFilters(tf => tf.Add("customasciifolding", new AsciiFoldingTokenFilter { PreserveOriginal = true })
)
)
);
然后在映射时按如下方式设置
await _elasticClient.MapAsync<MyClass>(m => m
.MapFromAttributes()
.AllField(af => af.Analyzer("customAll"))
);
总之我希望能够有一个只用于搜索的分析器。排序应该由默认分析器进行。
通过添加此代码,我可以成功地按预期进行搜索。当我搜索 "be" 时,我找到了带有 "Bé".
的内容 var an = new CustomAnalyzer();
an.Tokenizer = "keyword";
an.Filter = new List<string>();
an.Filter.Add("standard");
an.Filter.Add("lowercase");
an.Filter.Add("ascii_folding");
return await CreateIndexAsync(c => c
.Index(_index)
.Analysis(a => a.Analyzers(a1 => a1.Add("default", an)))
.Analysis(a => a.TokenFilters(tf => tf.Add("ascii_folding", new AsciiFoldingTokenFilter { PreserveOriginal = true })))
);
这导致我的排序也变成了 ascii 折叠。 一种 一种 B等等等等
阅读此处看来我应该能够将我的分析器应用于仅搜索。 https://www.elastic.co/guide/en/elasticsearch/reference/1.4/analysis-analyzers.html#default-analyzers
"and the default_search can be used to configure a default analyzer that will be used just when searching"
如果我理解正确,我应该能够将我的分析器应用于仅通过更改此行进行搜索。
.Analysis(a => a.Analyzers(a1 => a1.Add("default_search", an)))
这完全破坏了分析器。搜索将默认进行,并且不会点击 Bé。知道我在这里做错了什么吗?
这是我的要求
Request: {
"from": 0,
"size": 70,
"_source": {
"include": [
"Name",
]
},
"query": {
"bool": {
"must": [
{
"wildcard": {
"_all": {
"value": "*be*"
}
}
}
]
}
},
"filter": {}
}
我在 _all 中使用通配符搜索应该没有问题吧?
这是一个带排序的请求。问题是我这里的结果按 ascii 折叠值排序(如果我使用默认分析器)
Request: {
"from": 0,
"size": 70,
"sort": [
{
"Name": {
"order": "asc"
}
}
],
"_source": {
"include": [
"Name"
]
}
}
据我了解,您需要申请 sorting, because right now you sorting is based on _score。 所以你的查询是按通配符过滤的,然后取决于分数(找到匹配项的位置和频率)结果排序
.Analysis(a => a.Analyzers(a1 => a1.Add("default_search", an)))
您可以这样做,这样您就可以将其设置为带有 ascii 过滤器的默认分析器
PS。问题更新后。 您应该使用 multifield 这样您就应该有一个已分析的字段,一个未分析的字段。按已分析搜索,按未分析排序
如果您总是在 _all 字段上执行搜索,您可以为此设置一个不同的分析器。
创建两台分析仪,一台是标准的,一台是 ascii_folding。
var allAnalyzer = new CustomAnalyzer();
allAnalyzer.Tokenizer = "keyword";
allAnalyzer.Filter.Add("customasciifolding");
var defAnalyzer= new CustomAnalyzer();
defAnalyzer.Tokenizer = "keyword";
defAnalyzer.Filter = new List<string>();
defAnalyzer.Filter.Add("standard");
使用您的分析器创建索引。
return await CreateIndexAsync(c => c
.Index(_index)
.Analysis(a => a
.Analyzers(a1 => a1
.Add("default", defAnalyzer)
.Add("customAll",allAnalyzer)
)
.TokenFilters(tf => tf.Add("customasciifolding", new AsciiFoldingTokenFilter { PreserveOriginal = true })
)
)
);
然后在映射时按如下方式设置
await _elasticClient.MapAsync<MyClass>(m => m
.MapFromAttributes()
.AllField(af => af.Analyzer("customAll"))
);