ES的核心就是全文检索,在实际业务中全文检索用到最多的查询方式就是multi_match语法,该语法参数比较多,用的不好不但效果出不来而且还会影响性能,故这里对 multi_match 使用做下参数详解
基本语法
multi_match 顾名思义就是提供在多个字段上查询的意思,基本语法:
GET /_search
{
"query": {
"multi_match" : {
"query": "this is a test",
"fields": [ "title^2", "*_name" ]
}
}
}
-
query
来自用户输入的查询短语 -
fields
数组,默认支持最大长度1024,可以单独为任意字段设置相关度权重,支持通配符;fields可以为空,为空时会取mapping阶段配置的所有支持term查询的filed组合在一起进行查询
其它参数
-
type
定义内部查询方式和打分方式
值 | 说明 |
---|---|
best_fields | 按照match检索,所有字段单独计算得分并取最高分的field为最终_score,虽然是默认值,但不建议使用,数据量上来后查询性能会下降 |
most_fields | 按照match检索,融合所有field得分为最终_score |
cross_fields | 将fields中的所有字段融合成一个大字段进行match检索,此时要求所有字段使用相同分析器 |
phrase | 按照match_phrase检索,默认slop为0,执行短语精确匹配,所以即便设置 minimum_should_match 也无效; 取最高字段得分 |
phrase_prefix | 按照match_phrase_prefix检索,滑动步长slop默认为0;取最高字段得分 |
bool_prefix | 按照match_bool_prefix检索 |
需要注意的是当best_fields、most_fields与operator 或 minimum_should_match 参数连用时会要求用户输入词必须在任意单一字段上完全满足的文档才会出现,如
GET /_search
{
"_source": ["title","desc"],
"query": {
"multi_match": {
"query": "高端婚礼邀请函",
"fields": ["title","desc"],
"operator": "and"
}
}
}
其匹配逻辑为:
(title:高端 + title:婚礼 + title:邀请函) || (desc:高端 + desc:婚礼 + desc:邀请函)
可调整为如下方式,提升命中效果:
{
"_source": ["title","desc"],
"query": {
"multi_match": {
"query": "高端婚礼邀请函",
"fields": ["title","desc"],
"operator": "and",
"type": "cross_fields"
}
}
}
# 这种方式会将所有字段组合在一起作为一个大字段来用,在精确匹配时效果提升明显,命中商品数量比之前多
-
tie_breaker
取值范围0-1,当type使用默认值 best_fields ,tie_breaker将会改变默认_score计算方式,采用best_field_score + tie_breaker*other_field_score -
analyzer
用户搜索输入词采用哪种解析器进行分词,默认使用mapping阶段指定的分词器;如果analyzer设置和索引阶段的分词器不一致时,且operator为and 那么在执行查询时可能理应完全匹配的短语结果检索为空的情况。 -
fuzziness
指定模糊程度,支持数字或auto -
prefix_length
当使用模糊查询时,用来指定前缀不变长度 -
lenient
当查询报错时是否忽略该文档,默认为false -
operator
匹配关系的逻辑判断,默认为or,当为and时表示所有输入词必须完全匹配 -
minimum_should_match
该参数生效的前提是operator为or,支持数字、百分比或者混合配置,如:
# 当词长度>3时可以有一个模糊,>6时允许两个,超过10个则模糊一半
"minimum_should_match": "3<-1 6<-2 10<50%"
-
zero_terms_query
当用户输入词全部为停用词时是否返回文档,默认为none即不返回数据,设置为all时,查询将被改写为match_all -
auto_generate_synonyms_phrase_query
是否开启同义词查询,默认为true
#如在analysis/synonym.txt中设置可爱同义词为粉色、卡通,可爱风格将会被改写为
(可爱 OR (粉色 AND 卡通))风格
关于同义词的详细用法请参看我的另一篇文章ES同义词配置
网友评论