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 ...
随机推荐
- 「Python」matplotlib备忘录
总结了一下网上现有的资源,得到了一些东西.随手做个备忘. 更多设置见:https://matplotlib.org/users/customizing.html. 导入 import matplotl ...
- hdu1847Good Luck in CET-4 Everybody!(sg函数)
Good Luck in CET-4 Everybody! Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- python+selenium 环境配置
配置环境: python:3.5 selenium:3.3.0 安装方式:python pip install -u selenium windows: 10 firefox:52 因为firefox ...
- Python字符串格式化符号及转义字符含义(非常全!!!)
字符串格式化符号含义 符号 说明 %c 格式化字符及其 ASCII 码 %s 格式化字符串 %d 格式化整数 %o 格式化无符号八进制数 %x 格式化无符号十六进制数 %X 格式化无符号十六进制数(大 ...
- 数据库Mysql的学习(一)-启动和进入
数据库:按照数据结构来组织储存和管理数据的仓库. Mysql是关系型数据库管理系统 Mysql安装好之后... mysql的启动 1:通过控制面板里的”服务“找到mysql右键启动即可 2:开始菜单搜 ...
- 预分配内存fifo实现可变长度字节序列存储
预分配内存fifo实现可变长度字节序列存储 github链接https://github.com/gexin1023/utils/tree/master/fifo fifo即先进先出队列,可以用链表来 ...
- 【转】Keepalived+Tengine实现高可用集群
原文出处:http://502245466.blog.51cto.com/7559397/1301772 概述 近年来随着Nginx在国内的发展潮流,越来越多的互联网公司使用Nginx:凭Nginx的 ...
- Python练习—函数
1.编写函数f(n),实现输入n的值,求出n的阶乘.然后调用此函数计算1! +2!+3!+……10!的结果,输出到屏幕上. def f(n): count = 1; for i in range(1, ...
- C语言实验——时间间隔
Description 从键盘输入两个时间点(24小时制),输出两个时间点之间的时间间隔,时间间隔用“小时:分钟:秒”表示. 如:3点5分25秒应表示为--03:05:25.假设两个时间在同一天内,时 ...
- Daily Scrum 10
今天我们小组开会内容分为以下部分: part 1: 经过反复思考,对于上次组会确定的在系统中加入娱乐版块进行了更进一步的商讨; part 2:继续探讨算法实现: part 3:进行明日的任务分配; ◆ ...