ES(Elasticsearch)常用查询和布尔查询boolQuery

标签:

本文出自jvm123.com-java技术分享站:http://jvm123.com/2020/08/es-elasticsearch.html

ES完整查询示例:

 {
   "query": {
     "bool": {
       "must": [
        {
           "multi_match": {
             "query": "spring框架",
             "minimum_should_match": "50%",
             "fields": ["name^10", "description"]
          }
        },
        {
           "term": {
             "studymodel": "201001"
          }
        }
      ],
       "must_not": [],
       "should": [],
       "filter": [
        {
           "range": {
             "price": {
               "gte": 0,
               "lte": 100
            }
          }
        }
      ],
       "highlight": {
         "pre_tags": ["<tag1>"],
         "post_tags": ["</tag2>"],
         "fields": {
           "name": {},
           "description": {}
        }
      }
    }
  },
   "from": 0,
   "size": 10,
   "_source": ["name", "studymodel", "description", "price"],
   "sort": [
    {"studymodel": "desc"},
    {"price": "asc"}
  ],
   "aggs": {}
 }

查询属性说明:

query

es查询,为es查询的条件,具体见“es常用查询”

from

开始索引

size

查询文档的数量

_source

查询文档中的字段feild列表

sort

排序字段及方式

aggs

结果聚合,如count、sum、agv等,类似于sql中的聚合函数

ES常用的查询

TermQuery

Term Query为精确查询,在搜索时会整体匹配关键字,不再将关键字分词。

 {
   "query": {
     "term" : {
       "name": "spring"
    }
  }
 }

MatchQuery

match Query即全文检索,它的搜索方式是先将搜索字符串分词,再使用各各词条从索引中搜索。 match query与Term query区别是match query在搜索前先将搜索关键字分词,再拿各各词语去索引中搜索。

 {
   "query": {
     "match" : {
       "description" : {
         "query" : "spring开发",
         "operator" : "or"
      }
    }
  }
 }

MultiQuery

MultiQuery,一次可以匹配多个字段。

 {
   "query": {
     "multi_match" : {
       "query" : "spring框架",
       "minimum_should_match": "50%",
       "fields": [ "name^10", "description" ]
    }
  }
 }
  • name^10,表示name字段的 boost 权重提升10倍。

布尔查询boolQuery

布尔查询对应于Lucene的BooleanQuery查询,实现将多个查询组合起来。

  • must:表示必须,多个查询条件必须都满足。
  • should:表示或者,多个查询条件只要有一个满足即可。
  • must_not:表示非。

SearchQuery 总结

org.elasticsearch.index.query.QueryBuilders

queryName说明关键词分词
matchAllQuery查询所有
matchQuery分词
multiMatchQuery分词
matchPhraseQuery
matchPhrasePrefixQuery
idsQuery根据_id查询文档
termQuery匹配term
termsQuery匹配任何一个term
fuzzyQuery模糊,相似(自动判断)
prefixQuerystart with
rangeQuery范围(gt、lt、gte、lte)
wildcardQuery模糊(*匹配任意、?匹配单个字符)
regexpQueryk.*y 匹配 ky、key
queryStringQuery编写query_string(不推荐)
simpleQueryStringQuery编写query_string
existsQuery存在某个字段

Term查询不会对字段进行分词查询,会采用精确匹配。

Match会根据该字段的分词器,进行分词查询。

es中有以上常用的查询,bool查询就是使用must、should、must_not组合以上各个查询的查询方式。

ES中query与filter的区别

  1. query会对搜素导的记录计算score值,filter不会
  2. query的记录不会被缓存,filter则会
  3. query的速度较慢,filter比较快

发表评论