Elasticsearch Query DSL备忘(1)(Constant score query和Bool Query)
Query DSL (Domain Specific Language),基于json的查询方式
1、Constant score query,常量分值查询,目的就是返回指定的score,一般都结合filter使用,因为filter context忽略score。
GET /customer/_search
{
"query": {
"constant_score": {
"filter": {
"match": {
"addr": "天津,北京"
}
},
"boost": 5.2
}
}
} result:返回结果中score都是被指定的5.2
{
"took" : 8,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 2,
"max_score" : 5.2,
"hits" : [
{
"_index" : "customer",
"_type" : "doc",
"_id" : "510221197801023611",
"_score" : 5.2,
"_source" : {
"name" : "王刚",
"id" : "510221197801023611",
"addr" : "北京市朝阳区未名路109号",
"tel" : "13901004491"
}
},
{
"_index" : "customer",
"_type" : "doc",
"_id" : "51228199001013611",
"_score" : 5.2,
"_source" : {
"name" : "白开心",
"id" : "51228199001013611",
"addr" : "天津市海港路1021号",
"tel" : "13590850990"
}
}
]
}
}
2、bool query,布尔查询
Bool查询对应Lucene中的BooleanQuery,它由一个或者多个子句组成,每个子句都有特定的类型。
- must 返回的文档必须满足must子句的条件,并且参与计算分值
- filter 返回的文档必须满足filter子句的条件。但是不会像must一样参与计算分值
- should 返回的文档可能满足should子句的条件。bool查询在query context中,并且有一个must或filter子句,即使没有一个should查询匹配,文档也会进行bool匹配。在这种情况下,这些should仅用于影响分数。如果在filter context中,或者没有must或filter子句,那么should子句必须和文档匹配,才能匹配bool查询。这种行为由minimum_should_match 参与决定。
- must_not 返回的文档必须不满足must_not定义的条件。
官网的例子:
POST _search
{
"query": {
"bool" : {
"must" : {
"term" : { "user" : "kimchy" }
},
"filter": {
"term" : { "tag" : "tech" }
},
"must_not" : {
"range" : {
"age" : { "gte" : 10, "lte" : 20 }
}
},
"should" : [
{ "term" : { "tag" : "wow" } },
{ "term" : { "tag" : "elasticsearch" } }
],
"minimum_should_match" : 1,
"boost" : 1.0
}
}
}
bool查询案例分解:
第一步:查询name为“李云龙”的文档
GET /customer/_search
{
"query": {
"bool": {
"must": {
"term":{"name.keyword":"李云龙"}
}
}
}
}
返回三个文档:
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 3,
"max_score" : 1.4916549,
"hits" : [
{
"_index" : "customer",
"_type" : "doc",
"_id" : "4",
"_score" : 1.4916549,
"_source" : {
"name" : "李云龙",
"id" : "510221197001013611",
"addr" : "昆明市滇池路阳光时代1栋1单元",
"tel" : "13808712808"
}
},
{
"_index" : "customer",
"_type" : "doc",
"_id" : "224",
"_score" : 1.4916549,
"_source" : {
"name" : "李云龙",
"id" : "224",
"addr" : "天津市阳光路2008号",
"tel" : "13908712808"
}
},
{
"_index" : "customer",
"_type" : "doc",
"_id" : "510221197001013611",
"_score" : 1.4916549,
"_source" : {
"name" : "李云龙",
"id" : "510221197001013611",
"addr" : "上海市浦东区华北路8号",
"tel" : "13908712808"
}
}
]
}
}
第二步:加入过滤条件,只保留id为510221197001013611的文档
GET /customer/_search
{
"query": {
"bool": {
"must": {
"term":{"name.keyword":"李云龙"}
},
"filter": {
"term": {
"id": "510221197001013611"
}
}
}
}
} 返回结果减少到2个文档,并且score相同:
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 2,
"max_score" : 1.4916549,
"hits" : [
{
"_index" : "customer",
"_type" : "doc",
"_id" : "4",
"_score" : 1.4916549,
"_source" : {
"name" : "李云龙",
"id" : "510221197001013611",
"addr" : "昆明市滇池路阳光时代1栋1单元",
"tel" : "13808712808"
}
},
{
"_index" : "customer",
"_type" : "doc",
"_id" : "510221197001013611",
"_score" : 1.4916549,
"_source" : {
"name" : "李云龙",
"id" : "510221197001013611",
"addr" : "上海市浦东区华北路8号",
"tel" : "13908712808"
}
}
]
}
}
第三步:使用should,判断addr中必须有昆明市,这种情况下should子句会影响计分
GET /customer/_search
{
"query": {
"bool": {
"must": {
"term":{"name.keyword":"李云龙"}
},
"filter": {
"term": {
"id": "510221197001013611"
}
},
"should": [
{"match": {
"addr": "昆明市"
}}
]
}
}
}
返回结果中,地址是昆明市的文档score加重
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 2,
"max_score" : 3.408528,
"hits" : [
{
"_index" : "customer",
"_type" : "doc",
"_id" : "4",
"_score" : 3.408528,
"_source" : {
"name" : "李云龙",
"id" : "510221197001013611",
"addr" : "昆明市滇池路阳光时代1栋1单元",
"tel" : "13808712808"
}
},
{
"_index" : "customer",
"_type" : "doc",
"_id" : "510221197001013611",
"_score" : 1.5720221,
"_source" : {
"name" : "李云龙",
"id" : "510221197001013611",
"addr" : "上海市浦东区华北路8号",
"tel" : "13908712808"
}
}
]
}
}
第四步:加入must_not排除上海
GET /customer/_search
{
"query": {
"bool": {
"must": {
"term":{"name.keyword":"李云龙"}
},
"filter": {
"term": {
"id": "510221197001013611"
}
},
"should": [
{"match": {
"addr": "昆明市"
}}
],
"must_not": [
{"match": {
"addr": "上海"
}}
]
}
}
} 只返回一个文档:
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 3.408528,
"hits" : [
{
"_index" : "customer",
"_type" : "doc",
"_id" : "4",
"_score" : 3.408528,
"_source" : {
"name" : "李云龙",
"id" : "510221197001013611",
"addr" : "昆明市滇池路阳光时代1栋1单元",
"tel" : "13808712808"
}
}
]
}
}
Elasticsearch Query DSL备忘(1)(Constant score query和Bool Query)的更多相关文章
- Query DSL for elasticsearch Query
Query DSL Query DSL (资料来自: http://www.elasticsearch.cn/guide/reference/query-dsl/) http://elasticsea ...
- elasticsearch入门使用(三) Query DSL
Elasticsearch Reference [6.2] » Query DSL 参考官方文档 :https://www.elastic.co/guide/en/elasticsearch/refe ...
- Elasticsearch Query DSL 整理总结(三)—— Match Phrase Query 和 Match Phrase Prefix Query
目录 引言 Match Phase Query slop 参数 analyzer 参数 zero terms query Match Phrase 前缀查询 max_expansions 小结 参考文 ...
- 48.Query DSL
主要知识点 1.Query DSL的理解及基本语法 2.如何组合多个搜索条件 bool 一.Query DSL的理解 Query DSL的查询形式如下: GET /_search { &quo ...
- elasticsearch系列四:搜索详解(搜索API、Query DSL)
一.搜索API 1. 搜索API 端点地址 从索引tweet里面搜索字段user为kimchy的记录 GET /twitter/_search?q=user:kimchy 从索引tweet,user里 ...
- Elasticsearch使用备忘
最近我们需要对大约2T(6.5亿条)日志做全文检索,Elasticsearch看起来很火爆,又有很多产品使用(Facebook.github.stackoverflow),值得一试.以下是一些基础知识 ...
- Elasticsearch Query DSL 语言介绍
目录 0. 引言 1. 组合查询 2. 全文搜索 2.1 Match 2.2 Match Phase 2.3 Multi Match 2.4 Query String 2.5 Simple Query ...
- Elasticsearch(入门篇)——Query DSL与查询行为
ES提供了丰富多彩的查询接口,可以满足各种各样的查询要求.更多内容请参考:ELK修炼之道 Query DSL结构化查询 Query DSL是一个Java开源框架用于构建类型安全的SQL查询语句.采用A ...
- ElasticSearch的 Query DSL 和 Filter DSL
Elasticsearch支持很多查询方式,其中一种就是DSL,它是把请求写在JSON里面,然后进行相关的查询. Query DSL 与 Filter DSL DSL查询语言中存在两种:查询DSL(q ...
随机推荐
- Ping隧道
1.研究原因: 校园内网的探索,校内电子图书馆资源的利用,认证校园网 2.目的: 内网服务器:在一台因防火墙等原因仅限icmp数据通过的 公网服务器 : 建立icmp 隧道链接, 并在公网服务器上进 ...
- Qt-QML-Connections,接受组件信号
这里还没有什么新的体会.就直接上代码,在上篇一处上改出来的 import QtQuick 2.5 import QtQuick.Controls 1.4 ApplicationWindow { vis ...
- angular-使用iframe做独立页(iframe传值到angular和iframe里请求后台数据)
这个方法使用过两次.一次是在项目中嵌入一个表达式生成器.因为用别人做好的网页变成组件很难,而且里面用了jq,与angular思想相反不能用.另一次是因为想要单独引用样式.而innerHTML使用的样式 ...
- 【WXS全局对象】Date
属性: 名称 说明 Date.parse( [dateString] ) 解析一个日期时间字符串,并返回 1970/1/1 午夜距离该日期时间的毫秒数. Date.UTC(year,month,day ...
- python 终极篇 cookie与session
()cookie与session---------->>>>>>>>>>>>>>>>>>&g ...
- Spring Cloud(九):配置中心(消息总线)【Finchley 版】
Spring Cloud(九):配置中心(消息总线)[Finchley 版] 发表于 2018-04-19 | 更新于 2018-05-07 | 我们在 Spring Cloud(七):配置中心 ...
- Spring Cloud(十):服务网关 Zuul(路由)【Finchley 版】
Spring Cloud(十):服务网关 Zuul(路由)[Finchley 版] 发表于 2018-04-23 | 更新于 2018-05-09 | 通过之前几篇 Spring Cloud 中 ...
- 查看python中包的文档
核心命令:python -m pydoc 查询某包:python -m pydoc 包名 示例: C:\Users\xxx>python -m pydoc pydoc - the Python ...
- 【Linux 运维】Centos7初始化网络配置
设置网络 (1)动态获取一个IP地址 #dhclient 系统自动自动获取一个IP地址#ip addr 查看获取的ip地址(2)查看网关,子网掩码 虚拟机编辑>虚拟 ...
- 【第五章】MySQL数据库的安全机制
MySQL权限表MySQL用户管理MySQL权限管理SSL加密连接