-
概述
用于在多个字段上执行相同查询
格式样例
{ "multi_match": { "query": "Quick brown fox", # 查询词 "type": "best_fields", # 匹配方式 "fields": [ "title", "body" ], # 查询字段 "tie_breaker": 0.3, # 多个字段的相关性 "minimum_should_match": "30%", # 匹配度 "analyzer": "standard", # 分词器 "operator": "and" # 匹配逻辑 } }
参数解释
-
query : 查询词、句,
-
type :匹配方式,有三种方式可选
-
best_fields 最佳匹配 (默认类型,可不指定)
-
most_fields 多数字段匹配
{ "query": { "multi_match" : { "query": "quick brown fox", "type": "most_fields", "fields": [ "title", "title.original", "title.shingles" ] } } } 相当于 { "query": { "bool": { "should": [ { "match": { "title": "quick brown fox" }}, { "match": { "title.original": "quick brown fox" }}, { "match": { "title.shingles": "quick brown fox" }} ] } } }
-
cross_fields 跨字段匹配
- 所有的匹配词必须至少在一个字段中出现才会匹配(通常对boost为1的短字符串有用)
- fuzziness参数不可和cross_fields一起使用
{ "query": { "multi_match" : { "query": "Will Smith", "type": "cross_fields", "fields": [ "first_name", "last_name" ], "operator": "and" } } } 相当于 +(first_name:will last_name:will)+(first_name:smith last_name:smith)
{ "query": { "multi_match" : { "query": "Jon", "type": "cross_fields", "fields": [ "first", "first.edge", "last", "last.edge" ] } } } 相当于 blended("jon", fields: [first, last]) | ( blended("j", fields: [first.edge, last.edge]) blended("jo", fields: [first.edge, last.edge]) blended("jon", fields: [first.edge, last.edge]) )
-
phrase 短语匹配,该方式下不会被分词。(该方式因为不会被分词,用于精确匹配)
-
phrase_prefix 前缀短语匹配
{ "query": { "multi_match" : { "query": "quick brown f", "type": "phrase_prefix", "fields": [ "subject", "message" ] } } } 相当于 { "query": { "dis_max": { "queries": [ { "match_phrase_prefix": { "subject": "quick brown f" }}, { "match_phrase_prefix": { "message": "quick brown f" }} ] } } }
-
bool_prefix 指定为该方式,表明只希望查询到一个bool值
-
-
fields :需要查询的字段列表,默认最多给定
1024
个 。- **给定字段本身支持模糊查询,如 **
"fields": "*_title"
- **可以指定每个字段的匹配权重,如 **
"fields": [ "*_title", "chapter_title^2" ]
,其中chapter_title字段的boost为2,
- **给定字段本身支持模糊查询,如 **
-
tie_breaker:字段之间的相关度
分数 解释 0.0 从(例如)first_name:will 和last_name:will(默认)中取出单个最佳分数 1.0 将(例如)first_name:will 和 last_name:will 的分数加在一起 0.0 < n < 1.0 将单个最佳得分加上 tie_breaker 乘以其他匹配字段/组的每个得分 -
minimum_should_match :匹配阈值
-
operator :指定给定词之间的逻辑(默认使用的是or),具体示例如下
对于如下匹配• 目录 间隔查询(Intervals) Match匹配 间隔查询(Intervals) 官方文档 功能描述 一种用于在文本字段中执行精确的短语匹配的高级查询方式,在该方式中,通过intervals的特殊数据结构,可以更精确控制匹配行为的场景,如要求匹配的短语具有特定的顺序或距离限制。 结构示例 { "query": { "intervals" : { "my_text" : { "all_of" : { "ordered" : true, "intervals" : [ { "match" : { "query" : "my favorite food", "max_gaps" : 0, "ordered" : true } }, { "any_of" : { "intervals" : [ { "match" : { "query" : "hot water" } }, { "match" : { "query" : "cold porridge" } } ] } } ] } } } } } 查询解释: 查询字段名称为 "my_text"。 使用 "all_of" 子句,表示要求所有指定的间隔匹配 "ordered" 参数设置为 true,表示要求短语的间隔按照指定的顺序出现 第一个间隔是 "my favorite food",要求该短语的间隔没有任何间隔(max_gaps: 0)且按照指定的顺序出现(ordered: true) 第二个间隔使用 "any_of" 子句,表示至少要有一个间隔匹配。在这个例子中,有两个候选短语:"hot water" 和 "cold porridge"。只要有一个短语的间隔满足条件即可。 参数解释 参数名称 参数描述 match match 匹配 prefix 前缀匹配 wildcard 通配符匹配 fuzzy 模糊匹配 all_of 所有指定间隔匹配,给定匹配中必须都要满足 any_of 存在一个指定间隔匹配,给定匹配中只需要满足一个 Match匹配参数 参数名称 是否必要 参数类型 参数描述 默认参数 query 是 str 查询词/句 max_gaps 否 int 匹配词之间的最大间隔数,如果未指定或设置为 -1,则匹配没有宽度限制。 如果设置为 0,则这些术语必须相邻出现。 -1 ordered 否 bool 是否需要保证顺序出现 false analyzer 否 str 指定分词器类型 默认为顶层分词器类型 filter 否 interval filter rule object 使用interval filter 进行过滤 use_field 否 str 指定匹配方式 postings:指定倒排索引匹配 doc_values: 使用文档的doc_values匹配 freqs: 使用词频匹配 positions: 使用词项的位置信息进行匹配 Prefix 匹配参数 用于匹配指定前缀,前缀匹配词个数最多为128个。 参数名 是否必要 参数类型 参数描述 默认参数 prefix 是 str 指定前缀 analyzer 否 str 分词器 use_field 否 str 匹配方式 Wildcard匹配参数 指定通配符进行匹配,最多扩展到128个匹配词。 参数名 是否必要 参数类型 参数描述 默认参数 pattern 是 str 匹配字符串 允许使用 [*?]进行匹配 *:任意个字符匹配,包括0 ?:单个字符匹配 避免使用 [*?] 匹配开头,会导致性能下降 analyzer 否 str 分词器 use_field 否 str 匹配方式 Fuzzy匹配参数 跟据模糊规则匹配给定匹配词,最多128个匹配词。 参数名 是否必要 参数类型 参数描述 默认参数 term 是 str 匹配词 prefix_length 否 int 用于控制前缀长度 0 transpositions 否 bool 控制词项交换参数,即是否允许词项交换(ab→ba) true fuzziness 否 str 最多进行模糊操作个数 auto analyzer 否 str 分词器 use_field 否 str 匹配方式,除非单独指定分析器,否则使用该字段中的搜索分析器对该术语进行规范化。 All_of 参数名称 是否必要 参数类型 参数描述 默认参数 intervals 是 匹配数组 具体匹配规则列表 max_gaps 否 int 匹配词之间的最大间隔数,如果未指定或设置为 -1,则匹配没有宽度限制。 如果设置为 0,则这些术语必须相邻出现。 -1 ordered 否 bool 是否需要顺序出现 false filter 否 interval 规则对象 过滤器 Any_of 参数名称 是否必要 参数类型 参数描述 默认参数 intervals 是 匹配数组 具体匹配规则列表 filter 否 interval 规则对象 过滤器 Filter 参数名称 是否必要 参数类型 参数描述 默认参数 after 否 查询对象 用于返回过滤规则中某个间隔之后的间隔的查询 before 否 查询对象 用于返回过滤规则中某个间隔之前发生的间隔的查询 contained_by 否 查询对象 用于返回过滤规则中的间隔所包含的间隔的查询 containing 否 查询对象 用于返回包含过滤规则中的间隔的查询 not_contained_by 否 查询对象 用于返回过滤规则中的间隔未包含的间隔的查询 not_containing 否 查询对象 用于返回不包含过滤规则间隔的间隔的查询 not_overlapping 否 查询对象 用于返回与过滤规则中的间隔不重叠的间隔的查询 overlapping 否 查询对象 用于返回与过滤规则中的间隔重叠的间隔的查询 script 否 查询对象 用于返回匹配文档的脚本 Match匹配 官方文档 结构示例 { "query": { "match": { "message": { "query": "this is a test" } } } } message: 字段名称 query:需要匹配的字段值 参数详解 参数名 是否必要 参数类型 参数描述 默认值 query 是 str、int、.etc 需要匹配的字段值 analyzer 否 str 分词器 auto_generate_synonyms_phrase_query 否 bool 控制在查询时是否自动生成短语查询中的同义词 true fuzziness 否 str 模糊容忍度 “0”:精确匹配 “1“: 允许一个编辑操作。例如,插入、删除或替换一个字符 “2”: 允许两个编辑操作 ”auto”: 基于目标词的长度决定最大编辑距离。一般情况下,长度小于等于两个字符的词允许一个编辑操作,长度大于两个字符的词允许两个编辑操作。 ”2s": 允许两个编辑操作,但对较短的词应用了更严格的限制 max_expansions 否 int 控制查询时查询词展开的最大数量 适用于某些查询类型,如前缀查询(Prefix Query)和通配符查询(Wildcard Query) 50 prefix_length 否 int 在模糊匹配中保留字符串开头的字符数 0 fuzzy_transpositions 否 bool 是否允许交换词 true fuzzy_rewrite 否 str 指定查询的重写方法 lenient 否 bool 是否启用宽松模式,用于控制是否忽略格式错误。 false operator 否 str 指定bool运算的操作符 or: 给定词任意一个匹配即可 and: 给定词全部匹配才行 or minimum_should_match 否 str 指定返回最小匹配子句数,可给如下格式 1. 具体数值:必须匹配的最小子句数 2. 百分比值:表示根据总子句数计算的最小匹配子句数 3. "number" 或 "percentage" 加一个 "+" 号:表示匹配的子句数超过指定值 4. "number" 或 "percentage" 加一个 "-" 号:表示匹配的子句数少于指定值 zero_terms_query 否 str 零词查询,指定当分析器移除所有词项时是否返回文档 "none"(默认值):如果分析器移除了所有词项,则不返回任何文档。这意味着如果查询经过分析后不剩下任何词项,将不会有文档被返回 "all":返回所有文档,类似于使用"match_all"查询。即使查询经过分析后不剩下任何词项,也会返回所有文档 none •
实际执行逻辑如下,即所有匹配词必须
同时
满足到一个给定字段(区别于or,只需要满足一个匹配即匹配)(+first_name:will +first_name:smith) | (+last_name:will +last_name:smith)
组合字段查询(combined_fields)以及cross_fields模式可以打破单个字段限制
-
analyzer 指定分词器
-
版权归属:
EulerBlind
许可协议:
本文使用《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》协议授权
评论区