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 ...
随机推荐
- ORB-SLAM(八)ORBmatcher 特征匹配
该类负责特征点与特征点之间,地图点与特征点之间通过投影关系.词袋模型或者Sim3位姿匹配.用来辅助完成单目初始化,三角化恢复新的地图点,tracking,relocalization以及loop cl ...
- Python-特殊变量
from test import test ''' __mame__ __file__ __cache__ __package__ ''' # import os # 获取这个当前文件的绝对路径 # ...
- linux进程的学习笔记(未完)
1. 进程是程序执行的一个实例,如果16个用户同时运行vi,那么有16个独立的进程,尽管它们共享同一个可执行代码,问题在于FreeRTOS这种系统,是否可以建2个相同的任务,需要注意什么?在linux ...
- 获取项目中.txt 文件的内容
package com.fh.controller.ruitai.util; import java.io.BufferedInputStream; import java.io.File; impo ...
- 「日常训练」COMMON 约数研究(HYSBZ-1968)
题意与分析 感谢https://www.cnblogs.com/Leohh/p/7512960.html的题解.这题话说原来不在我的训练范围,正好有个同学问我,我就拿来做做.数学果然不是我擅长的啊,这 ...
- VIN码识别:让VIN码采集so easy!
近几年汽车后市场呈喷井式发展,在过去的半年,汽车后市场规模已高达万亿级,产业前景广阔,与此同时行业运营也受信息区域化.数据不统一的制约,让企业面临着效率低下.规模化运行困难的痛点. 在汽车配件市场中, ...
- 微信小程序—day02
全局配置 在app.json中,对小程序进行全局配置.官方文档 tabBar是对底部/顶部导航栏的配置,图片的icon 大小限制为40kb,建议尺寸为 81px * 81px 去阿里矢量图网站,找到图 ...
- 七 Appium常用方法介绍
文本转自:http://www.cnblogs.com/sundalian/p/5629609.html 由于appium是扩展了Webdriver协议,所以可以使用webdriver提供的方法,比如 ...
- 第八模块:算法&设计模式、企业应用 第1章 常用算法&设计模式学习
第八模块:算法&设计模式.企业应用 第1章 常用算法&设计模式学习
- 初学Direct X(8) ——碰撞检测
初学Direct X(8) --碰撞检测 真正让一个游戏鹤立鸡群的是程序对碰撞的响应有多好,这里介绍两种检测的方法: 1) 基于边框的碰撞检测 2) 基于距离的碰撞检测 1. 基于边框的碰撞检测 1. ...