ES Match Query

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES Match Query相关的知识,希望对你有一定的参考价值。

参考技术A

为了能够在后面能深入理解 Match Query 中的各个属性的意义,我们先构建一个 index 示例(有兴趣的同学只要将下面字段粘贴到 sense 中就可以创建)。

match 查询是一种 bool 类型的查询。什么意思呢?举个例子,查询 people type 的 hobbies 为 football basketball

会将上面的两个文档都搜索出来。为什么?上面的查询其实隐藏了一个默认参数 operator , 它的默认值是 or ,也就是说上面的查询也可以写成这种形式

这样就比较容易理解了,既然是 or 操作符,就表示只要查询的文档的 hobbies 字段中含有 football 和 basketball 任意一个,就可以被匹配到。

如果将 operator 操作符的值改为 and ,则表示需要同时包含 football 和 basketball , 得到的结果就只能是 文档 1 Jim 小朋友了。

analyzer 属性是指在对查询文本分析时的分析器

这里我们也没有指定,就会使用默认的,就不举例了,在后面文章讲解 analyzer 时再拓展。

默认值是 false , 表示用来在查询时如果数据类型不匹配且无法转换时会报错。如果设置成 true 会忽略错误。

例如, 例子中的 age 是 integer 类型的,如果查询 age=xxy ,就会导致无法转换而报错。

而如果将 lenient 参数设置为 true ,就会忽略这个错误

注意,如果将 age 字段的值设置为字符串 "10", 来查询,由于能够转换成整数,这时 elastic 内部会将 字符串先转换成整数再做查询,不会报错。

fuzziness 参数可以使查询的字段具有模糊搜索的特性。来先了解下什么是模糊搜索。

通过模糊搜索可以查询出存在一定相似度的单词,那么怎么计算两个单词是否有相似度以及相似度的大小呢?这就要了解下另外一个概念: Levenshtein Edit Distance

例如,单词 "god" 只需要插入一个 \'o\' 字符就可以变为 "good",因此它们之间的编辑距离为 1。

了解了上面两个概念,回过头再来看下 fuzziness 参数。

在查询 text 或者 keyword 类型的字段时, fuzziness 可以看做是莱文斯坦距离。

fuzziness 参数的取值如下

如果不设置 fuziness 参数,查询是精确匹配的。

来看例子,上面创建了一个 doc

设置 fuzziness 为 AUTO ,

来,验证下

prefix_length 表示不能没模糊化的初始字符数。由于大部分的拼写错误发生在词的结尾,而不是词的开始,使用 prefix_length 就可以完成优化。注意 prefix_length 必须结合 fuzziness 参数使用。

例如,在查询 hobbies 中的 football 时,将 prefix_length 参数设置为 3,这时 foatball 将不能被匹配。

TODO(max_expansions 参数对于 match 查询而言,没理解表示的意义,如果您知道这个参数的用法,请给我留言告知,不胜感谢! )

先看例子, 先创建一个文档 zero_terms_query_test 其中 message 字段使用 stop 分析器,这个分析器会将 stop words 停用词在索引时全都去掉。

那么就像 message 字段中的 to be or not to be 这个短语中全部都是停止词,一过滤,就什么也没有了,得不到任何 tokens, 那搜索时岂不什么都搜不到。

zero_terms_query 就是为了解决这个问题而生的。它的默认值是 none ,就是搜不到停止词(对 stop 分析器字段而言),如果设置成 all ,它的效果就和 match_all 类似,就可以搜到了。

查询字符串时的词项会分成低频词(更重要)和高频词(次重要)两类,像前面所说的停用词 (stop word)就属于高频词,它虽然出现频率较高,但在匹配时可能并不太相关。实际上, 我们往往是想要文档能尽可能的匹配那些低频词,也就是更重要的词项

要实现这个需求,只要在查询时配置 cutoff_frequency 参数就可以了。假设我们将 cutoff_frequency 设置成 0.01 就表示

从而将高频词(次重要的词)挪到可选子查询中,让它们只参与评分,而不参与匹配;高频词(更重要的词)参与匹配和评分。

这样一来,就不再需要 stopwords 停用词文件了,从而变成了动态生成停用词: 高频词就会被看做是停用词。这种配置只是对于词项比较多的场合如 email body,文章等适用,文字太少, cutoff_frequency 选项设置的意义就不大了。

cutoff_frequency 配置有两种形式

下面给个例子, 在创建的 3 个文档中都包含 "be " 的单词,在查询时将 cutoff_frequency 参数设置为 2, 表示 "be" 就是高频词,只会参与评分,但在匹配时不做考虑。

此时查询的内容为 "to be key" ,由于 "be" 词项是高频词,因为在文档中必须要存在 "to" 或者 "key" 才能匹配,因此文档 3 不能匹配。

synonyms 是指同义词,只要索引和字段中配置了同义词过滤器,match 查询是支持多词条的同义词扩展的。在应用过滤器后,解析器会对每个多次条同义词创建一个语句查询。

例如,同义词 USA, united states of America 就会构建出 (USA OR ("united states of America")) 。看下面例子:

文章转自: https://www.cnblogs.com/reycg-blog/p/10002794.html#zero-terms-query

es的query查询(term,prefix,exists,match,matchprase,range)

//查询前缀包含的内容
POST /products/_search

  "query": 
    "prefix": 
      "desc.keyword": 
        "value": "iP"
      
    
  


POST /products/_search

  "query": 
    "term": 
      "productID.keyword": "XHDK-A-1293-#fJ3"
    
  


//不查询为空的数据
POST /products/_search

  "query": 
    "exists": 
      "field": "desc"
    
  


The field in the source JSON is null or []
The field has "index" : false set in the mapping
The length of the field value exceeded an ignore_above setting in the mapping
The field value was malformed and ignore_malformed was defined in the mapping

//range query,区间查询
POST /products/_search

  "query": 
    "range": 
      "price": 
        "gte":100,
        "lte": 2000
      
    
  


//使用match会分词
POST /products/_search

  "query": 
    "match": 
      "productID": "XHDK JODL"
    
  


POST /products/_search

  "query": 
    "term": 
      "desc": 
        "value":"iphone"
      
    
  

es match、match_phrase、query_string和term的区别,可查看这链接

es match、match_phrase、query_string和term的区别 - 护花使者 - 博客园

以上是关于ES Match Query的主要内容,如果未能解决你的问题,请参考以下文章

es中的term和match的区别

Elasticsearch es Match Query

ES查询-term VS match (转)

es查询term,match,match_phase,query_string的区别

es7.x(7)—短语搜索(match_phrase)

ES的临近匹配