ElasticSearch: [multi_match] 查询不支持 [search_analyzer]
ElasticSearch: [multi_match] query does not support [search_analyzer]
在 ElasticSearch 7.x 中,我使用具有 synonym filter 的分析器为数据字段编制了索引。
但是,为了支持 "exactly" 匹配数据字段中的查询词而不是与数据中的同义词匹配的查询,我将使用 search_analyzer
.
为此,对于我想要精确匹配的查询,我想提供一个没有同义词过滤器的分析器。这可以通过 search_analyzer
来完成。但是,我的主要查询是一个 multi_match
查询,用于在所有需要的字段上搜索这些术语(并且具有不同的重要性(提升))。
ElasticSearch 似乎不允许在 multi-match
查询中使用 search_analyzer
。
有哪些选择?要么用于我的高级解决方案(在同义词上提升精确词),要么在我在具有不同提升(重要性权重)的不同字段中搜索时合并 search_analyzer
。
PS:我不想重新索引数据字段,一个有同义词分析器,另一个没有。
Search_analyzer
是索引时间的param,所以如果要为同义词的字段设置它:
{
"settings": {
"index" : {
"analysis" : {
"analyzer" : {
"synonym" : {
"tokenizer" : "whitespace",
"filter" : ["synonym"]
}
},
"filter" : {
"synonym" : {
"type" : "synonym",
"synonyms_path" : "analysis/synonym.txt"
}
}
}
}
}, "mappings" : {
"properties" : {
"description" : {
"type" : "text",
"analyzer": "synonym",
"search_analyzer": "standard"
},
"content" : {
"type" : "text",
"analyzer": "synonym",
"search_analyzer": "standard",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
通过这种方式,您已经为查询时间设置了默认分析器。所以您现在可以通过这种方式执行 multimatch
查询:
{
"query": {
"multi_match" : {
"query": "bread cereal",
"type": "cross_fields",
"fields": [
"description",
"content"
],
"operator": "and"
}
}
}
如果您没有在索引时为这些字段设置特定的 search_analyzer
,则在查询时使用用于指示的同一分析器。如果您没有在索引时间设置 search_analyzer
,您可以 force to use a specific analyzer at query time 将 analyzer
参数放入查询中:
{
"query": {
"multi_match" : {
"query": "bread cereal",
"analyzer" : "standard",
"type": "cross_fields",
"fields": [
"description",
"content"
],
"operator": "and"
}
}
}
在 ElasticSearch 7.x 中,我使用具有 synonym filter 的分析器为数据字段编制了索引。
但是,为了支持 "exactly" 匹配数据字段中的查询词而不是与数据中的同义词匹配的查询,我将使用 search_analyzer
.
为此,对于我想要精确匹配的查询,我想提供一个没有同义词过滤器的分析器。这可以通过 search_analyzer
来完成。但是,我的主要查询是一个 multi_match
查询,用于在所有需要的字段上搜索这些术语(并且具有不同的重要性(提升))。
ElasticSearch 似乎不允许在 multi-match
查询中使用 search_analyzer
。
有哪些选择?要么用于我的高级解决方案(在同义词上提升精确词),要么在我在具有不同提升(重要性权重)的不同字段中搜索时合并 search_analyzer
。
PS:我不想重新索引数据字段,一个有同义词分析器,另一个没有。
Search_analyzer
是索引时间的param,所以如果要为同义词的字段设置它:
{
"settings": {
"index" : {
"analysis" : {
"analyzer" : {
"synonym" : {
"tokenizer" : "whitespace",
"filter" : ["synonym"]
}
},
"filter" : {
"synonym" : {
"type" : "synonym",
"synonyms_path" : "analysis/synonym.txt"
}
}
}
}
}, "mappings" : {
"properties" : {
"description" : {
"type" : "text",
"analyzer": "synonym",
"search_analyzer": "standard"
},
"content" : {
"type" : "text",
"analyzer": "synonym",
"search_analyzer": "standard",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
通过这种方式,您已经为查询时间设置了默认分析器。所以您现在可以通过这种方式执行 multimatch
查询:
{
"query": {
"multi_match" : {
"query": "bread cereal",
"type": "cross_fields",
"fields": [
"description",
"content"
],
"operator": "and"
}
}
}
如果您没有在索引时为这些字段设置特定的 search_analyzer
,则在查询时使用用于指示的同一分析器。如果您没有在索引时间设置 search_analyzer
,您可以 force to use a specific analyzer at query time 将 analyzer
参数放入查询中:
{
"query": {
"multi_match" : {
"query": "bread cereal",
"analyzer" : "standard",
"type": "cross_fields",
"fields": [
"description",
"content"
],
"operator": "and"
}
}
}