组合多查询
现实的查询需求从来都没有那么简单;它们需要在多个字段上查询多种多样的文本,并且根据一系列的标准来过滤。为了构建类似的高级查询,你需要一种能够将多查询组合成单一查询的查询方法。
你可以用
bool
查询来实现你的需求。这种查询将多查询组合在一起,成为用户自己想要的布尔查询(
Bool
)。
它接收以下参数:
1.must
文档
必须
匹配
这些条件才能被包含进来。
相当于sql中的
and
2.must_not
文档
必须不
匹配
这些条件才能被包含进来。
相当于sql中的
not
3.should
如果满足这些语句中的任意语句,将增加
_score
,否则,无任何影响。它们主要用于修正每个文档的相关性得分。
相当于sql中的
or
4.filter
必须
匹配,但它以不评分、过滤模式来进行。这些语句
对评分没有贡献
,只是根据过滤标准来排除或包含文档。
每一个子查询都独自地计算文档的相关性得分。一旦他们的得分被计算出来,
bool
查询
就将这些得分进行合并并且返回一个代表整个布尔操作的
得分score
。\
示例:下面的查询用于查找
title
字段匹配
how to make millions
并且不被标识为
spam
的文档。那些被标识为
starred
或在2014之后的文档,将比另外那些文档拥有更高的排名。如果
两者
都满足,那么它排名将更高:
"bool": {
"must": { "match": { "title": "how to make millions" }},
"must_not": { "match": { "tag": "spam" }},
"should": [
{ "match": { "tag": "starred" }},
{ "range": { "date": { "gte": "2014-01-01" }}}
Java代码
BoolQueryBuilder defaultQueryBuilder = QueryBuilders.boolQuery();
defaultQueryBuilder.must(QueryBuilders.matchQuery("title", "how to make millions"))
.mustNot(QueryBuilders.matchQuery("tag", "span"))
.should(QueryBuilders.matchQuery("tag", "starred"))
.should(QueryBuilders.rangeQuery("date").gte("2014-01-01"));
filter用法改造:
"bool": {
"must": { "match": { "title": "how to make millions" }},
"must_not": { "match": { "tag": "spam" }},
"should": [
{ "match": { "tag": "starred" }}
"filter": {
"range": { "date": { "gte": "2014-01-01" }}
注意filter中的条件不参与评分score排序
组合多查询现实的查询需求从来都没有那么简单;它们需要在多个字段上查询多种多样的文本,并且根据一系列的标准来过滤。为了构建类似的高级查询,你需要一种能够将多查询组合成单一查询的查询方法。你可以用bool查询来实现你的需求。这种查询将多查询组合在一起,成为用户自己想要的布尔查询(Bool)。它接收以下参数:1.must文档必须匹配这些条件才能被包含进来。相当于sql中的 and2.must_not文档必须不匹配这些条件才能被包含进来。相当于sql中的 not3...
错误的写法:
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder
.must(QueryBuilders.rangeQuery(field).gt(start))
.should(QueryBuilders.rangeQuery(field).gt(start))
.should(QueryBuilders.rangeQuery(field).gte(start).
这里写自定义目录标题写在前面原始需求变更需求问题分析解决问题
项目中遇到了一个查询问题,原本查询是title=“A” or content=“B”,经需求优化,需要变成(title=“A” or content=“B”) and (state = “C”)。
查询title或introduction中满足的字段值
GET forexknow_album_bean/_search
"query": {
"bool": {
"should": [
curl -H "Authorization: Basic ZWxhc3RpYzoxMjM0NTY=" -X POST "http://172.16.1.119:9200/test/_search?pretty" -H 'Content-Type: application/json' -d'
"query": {
"bool": {