文档章节

elasticsearch should实现or功能,设置minimum_should_match

 枫林飘影
发布于 2017/07/31 11:11
字数 707
阅读 4.3K
收藏 2

elasticsearch实现传统数据库中的or功能,需要使用bool下面的should关键字,对于A or B的情况,应该至少返回A和B中的一个,但是如下语句,不仅返回A和B中的至少一个,也返回了没有A也没有B的情况:

 {
   "query": {
     "bool": {
       "fileter":[
           {"range":{"date.keyword":{"gt":"20170101","lt":"20170201"}}}
       ]
       "should": [
           {"term": {"A.keyword": "0000000000"}},
           {"term": {"B.keyword": "0000000001"}}
      ]
    }
  }
}

参看elasticsearch官方文档,对should的说明如下:

should

The clause (query) should appear in the matching document. If the bool query is in a query context and has a must or filter clause then a document will match the bool query even if none of the should queries match. In this case these clauses are only used to influence the score. If the bool query is a filter context or has neither must or filter then at least one of the should queries must match a document for it to match the bool query. This behavior may be explicitly controlled by settings the minimum_should_match parameter.

表达的意思是:如果一个query语句的bool下面,除了should语句,还包含了filter或者must语句,那么should context下的查询语句可以一个都不满足,只是_score=0,所以上述查询语句,有无should语句,查询到的hits().total()是一样的,只是score不同而已。

为了达到传统数据库中or的功能,有如下两种方法:

  1. 将should语句写到must下面,然后让must和filter并列
    {
      "query": {
        "bool": {
    	  "fileter":[
    	      {"range":{"date.keyword":{"gt":"20170101","lt":"20170201"}}}
    	  ],
    	  "must":[
    		  {
    			"bool":{
    			  "should": [
    				  {"term": {"A.keyword": "0000000000"}},
    				  {"term": {"B.keyword": "0000000001"}}
    			  ]
    			 }
    		  }
    	  ]
        }
      }
    }

     

     2. 采用官方文档中的 minimum_should_match 参数

Type Example Description

Integer

3

Indicates a fixed value regardless of the number of optional clauses.

Negative integer

-2

Indicates that the total number of optional clauses, minus this number should be mandatory.

Percentage

75%

Indicates that this percent of the total number of optional clauses are necessary. The number computed from the percentage is rounded down and used as the minimum.

Negative percentage

-25%

Indicates that this percent of the total number of optional clauses can be missing. The number computed from the percentage is rounded down, before being subtracted from the total to determine the minimum.

Combination

3<90%

A positive integer, followed by the less-than symbol, followed by any of the previously mentioned specifiers is a conditional specification. It indicates that if the number of optional clauses is equal to (or less than) the integer, they are all required, but if it’s greater than the integer, the specification applies. In this example: if there are 1 to 3 clauses they are all required, but for 4 or more clauses only 90% are required.

Multiple combinations

2<-25% 9<-3

Multiple conditional specifications can be separated by spaces, each one only being valid for numbers greater than the one before it. In this example: if there are 1 or 2 clauses both are required, if there are 3-9 clauses all but 25% are required, and if there are more than 9 clauses, all but three are required.

minimum_should_match代表了最小匹配精度,如果设置minimum_should_match=1,那么should语句中至少需要有一个条件满足,查询语句如下:

{
  "query": {
    "bool": {
	  "fileter":[
	      {"range":{"date.keyword":{"gt":"20170101","lt":"20170201"}}}
	  ]
      "should": [
		  {"term": {"A.keyword": "0000000000"}},
		  {"term": {"B.keyword": "0000000001"}}
      ],
	  "minimum_should_match":1
    }
  }
}

第一种方法和第二种方法返回的结果是一致的。

另外,minimum_should_match的参数很多:

http://blog.csdn.net/xiao_jun_0820/article/details/51095521  讲的很清楚。

 

© 著作权归作者所有

粉丝 4
博文 40
码字总数 5173
作品 0
海淀
私信 提问
加载中

评论(0)

ElasticSearch查询 第五篇:布尔查询

ElasticSearch查询 第五篇:布尔查询 《ElasticSearch查询》目录导航: ElasticSearch查询 第一篇:搜索API ElasticSearch查询 第二篇:文档更新 ElasticSearch查询 第三篇:词条查询 Elasti...

浮躁的码农
2018/12/26
62
0
ELK 架构之 Elasticsearch、Kibana、Logstash 和 Filebeat 安装配置汇总(6.2.4 版本)

相关文章: ELK 架构之 Elasticsearch 和 Kibana 安装配置 ELK 架构之 Logstash 和 Filebeat 安装配置 ELK 架构之 Logstash 和 Filebeat 配置使用(采集过滤) Spring Boot 使用 Log4j2 之前...

foveni
2019/05/04
0
0
Elasticsearch入门篇——基础知识

还记得大二的时候,初入Java大门,就大言不惭的给老师说,我要开发一个搜索引擎,结果是各种学习,各种找资料,终于在期末的时候,做出了一个简单新闻搜索页面,搜索模块是使用了Lucene。 今...

JAVA_冯文议
2019/03/11
284
0
Scrapy分布式爬虫打造搜索引擎-(八)elasticsearch结合django搭建搜索引擎

Python分布式爬虫打造搜索引擎 基于Scrapy、Redis、elasticsearch和django打造一个完整的搜索引擎网站 推荐前往我的个人博客进行阅读:http://blog.mtianyan.cn/ 目录分章效果更佳哦 分章查看...

天涯明月笙
2017/07/01
0
0
Python学习笔记 - 02: 用Python Client连接ElasticSearch操作数据

Python Elasticsearch Client 是 ES 官方推荐的 python 客户端,这里以它为工具操作 elasticsearch 一、环境依赖 Python:3.6 ES依赖包:pyelasticsearch ElasticSearch:6.5.4 操作系统:M...

dragon_tech
2019/03/13
81
0

没有更多内容

加载失败,请刷新页面

加载更多

渲染学习笔记——渲染管线介绍及CPU应用阶段

1.GPU优越性及缺点 注意:GPU并行结构if/else两边都会进行计算(现在有改观) 2.渲染流水线 3.CPU应用阶段 Unity有一些资源可以开启read/write选项,当开启后,加载到现存中的数据不会在内存...

myctrd
32分钟前
68
0
在C#中使用Global Mutex的良好模式是什么?

Mutex类非常容易被误解,而全局互斥体更是如此。 创建全局互斥锁时,可以使用哪种良好,安全的模式? 一个会起作用的 无论我的机器位于哪个区域 保证正确释放互斥锁 如果没有获取互斥,可以选...

javail
33分钟前
56
0
从开发到生产上线,如何确定集群规划大小?

在 Flink 社区中,最常被问到的问题之一是:在从开发到生产上线的过程中如何确定集群的大小。这个问题的标准答案显然是“视情况而定”,但这并非一个有用的答案。本文概述了一系列的相关问题...

阿里云官方博客
34分钟前
74
0
Linux就该这么学 -- 命令 -- top&uptime&free

top top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用情况,常用于服务端性能分析。 在top命令中按f键后,可进入设置页面,可设置显示或隐藏对应的列,可设置按某...

jionzhao
37分钟前
49
0
Go - atomic包使用及atomic.Value源码分析

1. Go中的原子操作 原子性:一个或多个操作在CPU的执行过程中不被中断的特性,称为原子性。这些操作对外表现成一个不可分割的整体,他们要么都执行,要么都不执行,外界不会看到他们只执行到...

Java天天
40分钟前
54
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部