企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# Bool 查询 原文链接 : [https://www.elastic.co/guide/en/elasticsearch/reference/5.0/query-dsl-bool-query.html](https://www.elastic.co/guide/en/elasticsearch/reference/5.0/query-dsl-bool-query.html) 译文链接 : [http://www.apache.wiki/pages/viewpage.action?pageId=4882896](http://www.apache.wiki/pages/viewpage.action?pageId=4882896) 贡献者 : [蓝色飞扬](/display/~lixiaoqing) [<< Constant Score Query](http://www.apache.wiki/pages/viewpage.action?pageId=4882886) [Dis Max Query >>](http://www.apache.wiki/pages/viewpage.action?pageId=4882902) * * * ## Bool Query 与其他查询的bool组合相匹配的文档的查询。布尔查询映射到 **Lucene** 的 **BooleanQuery** 。它使用一个或者多个布尔条件来构建,每个条件都有一个类型出现,出现的类型有: | 事件 | 描述 | | --- | --- | | **must** | 子句(查询)必须出现在匹配的文档中,并将有助于得分。 | | **filter** | 子句(查询)必须出现在匹配的文档中。 然而不像 **must** 此查询的分数将被忽略。 | | **should** | 子句(查询)应出现在匹配文档中。 在布尔查询中不包含 **must** 或 **filter** 子句,一个或多个**should** 子句必须有相匹配的文件。 匹配 **should** 条件的最小数目可通过设置**_minimum_should_match_ **参数。 | | **must_not** | 子句(查询)不能出现在匹配的文档中。 | ![](/download/attachments/4882896/image2016-11-23%2011%3A29%3A44.png?version=1&modificationDate=1479872725000&api=v2)  **Bool在过滤器上下文中查询**                     如果该查询是在过滤器的上下文中使用,它的**should** 子句则至少有一个 **should** 子句需要相匹配 **Bool** **Query** 也支持 **_disable_coord_** 参数(默认为 **false**)。基本上,坐标相似性基于文档包含的所有查询项的分数来计算得分因子。 可查阅 **Lucene** 的 **BooleanQuery** 了解更多详情。 **Bool** **Query **遵循 _**more-matches-is-better** _的方法,所以每个匹配 **must** 或 **should** 条件的分数将被累加在一起,从而将最终 **_score  **提供给每个文档。 ``` POST _search{ "query": { "bool" : { "must" : { "term" : { "user" : "kimchy" } }, "filter": { "term" : { "tag" : "tech" } }, "must_not" : { "range" : { "age" : { "from" : 10, "to" : 20 } } }, "should" : [ { "term" : { "tag" : "wow" } }, { "term" : { "tag" : "elasticsearch" } } ], "minimum_should_match" : 1, "boost" : 1.0 } }} ``` ## 使用bool.filter得分 这种情况下指定的查询如使用filter元素对得分没有影响-得分以返回0 。 分数仅受指定查询的影响。 举例来说,当给定的全部文档status字段包含 **_active_** 属性时,以下所述三个查询返回所有文档 。 第一个查询分配比分0的所有文档,因此需指定为没有进球的查询: ``` GET _search{ "query": { "bool": { "filter": { "term": { "status": "active" } } } }} ``` 第二个 **Bool** 查询包含一个 **match_all** 查询,为所有文件分配一个1.0的得分。 ``` GET _search{ "query": { "bool": { "must": { "match_all": {} }, "filter": { "term": { "status": "active" } } } }} ``` 第三个 **constant_score** 查询的作用与上述第二个例子完全相同。  **constant_score** 查询分配由过滤器所匹配的所有文档一个1.0的得分。 ``` GET _search{ "query": { "constant_score": { "filter": { "term": { "status": "active" } } } }} ``` ## 使用命名查询来看看哪些子句匹配 如果你需要知道与 bool 查询返回的所有文档相匹配的此查询中的子句,你可以使用命名查询给每个条件分配一个名称。 * * * [<< Constant Score Query](http://www.apache.wiki/pages/viewpage.action?pageId=4882886) [Dis Max Query >>](http://www.apache.wiki/pages/viewpage.action?pageId=4882902)