ElasticSearch如何保证所有词都参与搜索
ElasticSearch how to ensure that all words are involved in search
假设我在 ElasticSearch 6 中有一个索引:
"mappings" : {
"pet" : {
"name" : {
"type" : "text"
},
"info" : {
"type" : "text"
},
"description" : {
"type" : "text"
}
}
}
我需要使用用户键入的相同输入字符串对所有字段执行全文搜索:'big grey dog' 或 'small cute cat'。我如何在相关性中搜索那些包含来自输入的更多单词的单元。无论在哪里 - 名称或描述。我想要那个单位:
{
"name" : "big",
"info" : "grey",
"description" : "dog"
}
得分高于单位:
{
"name" : "grey dog",
"info" : "dog dog grey dog",
"description" : "grey dog grey dog grey dog"
}
如果您正在使用 multiMatch
查询,您应该使用 cross_field
类型和 AND
运算符 (see here)。
但是因为它只会匹配包含所有术语的文档,所以你应该使用带有两个 should
子句的 bool query
,一个带有默认类型(又名 best_fields
)和默认类型的松散子句OR
运算符和类型为 cross_field
和运算符 AND
的严格运算符。
有了这个,它会提升匹配所有字段的文档,并继续显示只匹配某些术语的低分文档:
类似于:
"query": {
"bool": {
"should": [
{
"multi_match": {
"query": "<here your query>",
"fields": ["name", "info", "description"],
"type": "cross_fields",
"operator": "AND"
}
},
{
"multi_match": {
"query": "<here your query>",
"fields": ["name", "info", "description"],
}
}
]
}
}
假设我在 ElasticSearch 6 中有一个索引:
"mappings" : {
"pet" : {
"name" : {
"type" : "text"
},
"info" : {
"type" : "text"
},
"description" : {
"type" : "text"
}
}
}
我需要使用用户键入的相同输入字符串对所有字段执行全文搜索:'big grey dog' 或 'small cute cat'。我如何在相关性中搜索那些包含来自输入的更多单词的单元。无论在哪里 - 名称或描述。我想要那个单位:
{
"name" : "big",
"info" : "grey",
"description" : "dog"
}
得分高于单位:
{
"name" : "grey dog",
"info" : "dog dog grey dog",
"description" : "grey dog grey dog grey dog"
}
如果您正在使用 multiMatch
查询,您应该使用 cross_field
类型和 AND
运算符 (see here)。
但是因为它只会匹配包含所有术语的文档,所以你应该使用带有两个 should
子句的 bool query
,一个带有默认类型(又名 best_fields
)和默认类型的松散子句OR
运算符和类型为 cross_field
和运算符 AND
的严格运算符。
有了这个,它会提升匹配所有字段的文档,并继续显示只匹配某些术语的低分文档:
类似于:
"query": {
"bool": {
"should": [
{
"multi_match": {
"query": "<here your query>",
"fields": ["name", "info", "description"],
"type": "cross_fields",
"operator": "AND"
}
},
{
"multi_match": {
"query": "<here your query>",
"fields": ["name", "info", "description"],
}
}
]
}
}