当前位置:首页 > ES > 正文内容

elasticsearch模糊查询match match_phrase wildcard regexp prefix的区别

phpmianshi1年前 (2019-07-15)ES105

1.match查询

会先对搜索词进行分词,比如“白雪公主和苹果”,会分成“白雪”“公主”“苹果”。含有相关内容的字段,都会被检索出来。

2.match_phrase查询

match_phrase与slop一起用,能保证分词间的邻近关系,slop参数告诉match_phrase查询词条能够相隔多远时仍然将文档视为匹配,默认是0。为0时 必须相邻才能被检索出来。
例如下面的语句,会把“白雪公主吃苹果”也能检索出来

GET my_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match_phrase": {
            "content": "白雪公主和苹果",
            "slop":1
          }
        }
        ]
    }
  }
}


3.wildcard查询

是使用通配符进行查询,其中?代表任意一个字符*代表任意的一个或多个字符。
下面的语句会把包含“公主”这个词语的内容检索出来。

GET my_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "wildcard": {
            "content": "*公主*"
          }
        }
        ]
    }
  }
}

这也是一种不分词查询的方法,比如content内容是 aaaa或者中英文数字混合 ,你搜索 aaa的时候match和match_phrase都查不出来

但是用wildcard模糊查询就可以查出来,最好避免在检索词的开头使用 * 或者 ?,这会降低搜索性能。大部分情况后面放个*就满足需求了。


4.regexp查询

基于词条,正则表达式查询的性能在很大程度上取决于所选的正则表达式。匹配像 .* 这样的所有内容非常慢,并且使用环绕正则表达式。如果可能,您应该在正则表达式开始之前尝试使用长前缀。

像 .* ?+这样的通配符匹配器会降低性能,尽量不要使用。

GET my_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "regexp": {
            "content": "公主.*苹果"
          }
        }
        ]
    }
  }
}


参考:https://www.elastic.co/guide/en/elasticsearch/reference/6.2/query-dsl-regexp-query.html

5.prefix查询

基于词条,查询已什么开头的内容,前缀查询映射到Lucene PrefixQuery。

如果满足你的需求,前缀匹配是优于wildcard和regexp。

GET comment/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "prefix": {
            "content": "hhh"
          }
        }
        ]
    }
  }
}

参考:https://www.elastic.co/guide/en/elasticsearch/reference/6.2/query-dsl-prefix-query.html

版权声明:本文由PHP面试资料网发布,如需转载请注明出处。
分享给朋友:

相关文章

elasticsearch中query和filter区别

区别在进行query的时候,除了完成匹配的过程,我们实际上在问“这个结果到底有多匹配我们的搜索关键词”。在所有的返回结果的后面都会有一个_score字段表示这个结果的匹配程度,也就是相关性。相关性越高...

kibana DevTools语句查询详解

直接点击Dev Tools,来看基本操作1,输入:GET /{   "name": "GddjX_V",  &nbs...

logstash增量同步mysql到es配置详解

配置详解input {   jdbc {     # mysql相关jdbc配置   ...

elasticsearch中分析器的原理和使用

概念分析(analysis)机制用于进行全文文本(Full Text)的分词,以建立供搜索用的反向索引。原理分析器的工作过程大概分成两步:分词(Tokenization):根据停止词把文本分割成很多的...

elasticsearch中重新索引数据

概念虽然你可以给索引添加新的类型,或给类型添加新的字段,但是你不能添加新的分析器或修改已有字段。假如你这样做,已被索引的数据会变得不正确而你的搜索也不会正常工作。 修改在已存在的数据最简单的...

elasticsearch中最重要的查询过滤语句

term 过滤term 主要用于精确匹配哪些值,比如数字,日期,布尔值或 not_analyzed 的字符串(未经分析的文本数据类型){ "term": { "age&q...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。