Query DSL (Domain Specific Language),基于json的查询方式

1、Constant score query,常量分值查询,目的就是返回指定的score,一般都结合filter使用,因为filter context忽略score。

  1. GET /customer/_search
  2. {
  3. "query": {
  4. "constant_score": {
  5. "filter": {
  6. "match": {
  7. "addr": "天津,北京"
  8. }
  9. },
  10. "boost": 5.2
  11. }
  12. }
  13. }
  14.  
  15. result:返回结果中score都是被指定的5.2
  16. {
  17. "took" : 8,
  18. "timed_out" : false,
  19. "_shards" : {
  20. "total" : 1,
  21. "successful" : 1,
  22. "skipped" : 0,
  23. "failed" : 0
  24. },
  25. "hits" : {
  26. "total" : 2,
  27. "max_score" : 5.2,
  28. "hits" : [
  29. {
  30. "_index" : "customer",
  31. "_type" : "doc",
  32. "_id" : "510221197801023611",
  33. "_score" : 5.2,
  34. "_source" : {
  35. "name" : "王刚",
  36. "id" : "510221197801023611",
  37. "addr" : "北京市朝阳区未名路109号",
  38. "tel" : "13901004491"
  39. }
  40. },
  41. {
  42. "_index" : "customer",
  43. "_type" : "doc",
  44. "_id" : "51228199001013611",
  45. "_score" : 5.2,
  46. "_source" : {
  47. "name" : "白开心",
  48. "id" : "51228199001013611",
  49. "addr" : "天津市海港路1021号",
  50. "tel" : "13590850990"
  51. }
  52. }
  53. ]
  54. }
  55. }

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定义的条件。

官网的例子:

  1. POST _search
  2. {
  3. "query": {
  4. "bool" : {
  5. "must" : {
  6. "term" : { "user" : "kimchy" }
  7. },
  8. "filter": {
  9. "term" : { "tag" : "tech" }
  10. },
  11. "must_not" : {
  12. "range" : {
  13. "age" : { "gte" : 10, "lte" : 20 }
  14. }
  15. },
  16. "should" : [
  17. { "term" : { "tag" : "wow" } },
  18. { "term" : { "tag" : "elasticsearch" } }
  19. ],
  20. "minimum_should_match" : 1,
  21. "boost" : 1.0
  22. }
  23. }
  24. }

bool查询案例分解:

第一步:查询name为“李云龙”的文档

  1. GET /customer/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": {
  6. "term":{"name.keyword":"李云龙"}
  7. }
  8. }
  9. }
  10. }
  11. 返回三个文档:
  12. {
  13. "took" : 0,
  14. "timed_out" : false,
  15. "_shards" : {
  16. "total" : 1,
  17. "successful" : 1,
  18. "skipped" : 0,
  19. "failed" : 0
  20. },
  21. "hits" : {
  22. "total" : 3,
  23. "max_score" : 1.4916549,
  24. "hits" : [
  25. {
  26. "_index" : "customer",
  27. "_type" : "doc",
  28. "_id" : "4",
  29. "_score" : 1.4916549,
  30. "_source" : {
  31. "name" : "李云龙",
  32. "id" : "510221197001013611",
  33. "addr" : "昆明市滇池路阳光时代1栋1单元",
  34. "tel" : "13808712808"
  35. }
  36. },
  37. {
  38. "_index" : "customer",
  39. "_type" : "doc",
  40. "_id" : "224",
  41. "_score" : 1.4916549,
  42. "_source" : {
  43. "name" : "李云龙",
  44. "id" : "224",
  45. "addr" : "天津市阳光路2008号",
  46. "tel" : "13908712808"
  47. }
  48. },
  49. {
  50. "_index" : "customer",
  51. "_type" : "doc",
  52. "_id" : "510221197001013611",
  53. "_score" : 1.4916549,
  54. "_source" : {
  55. "name" : "李云龙",
  56. "id" : "510221197001013611",
  57. "addr" : "上海市浦东区华北路8号",
  58. "tel" : "13908712808"
  59. }
  60. }
  61. ]
  62. }
  63. }

第二步:加入过滤条件,只保留id为510221197001013611的文档

  1. GET /customer/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": {
  6. "term":{"name.keyword":"李云龙"}
  7. },
  8. "filter": {
  9. "term": {
  10. "id": "510221197001013611"
  11. }
  12. }
  13. }
  14. }
  15. }
  16.  
  17. 返回结果减少到2个文档,并且score相同:
  18. {
  19. "took" : 0,
  20. "timed_out" : false,
  21. "_shards" : {
  22. "total" : 1,
  23. "successful" : 1,
  24. "skipped" : 0,
  25. "failed" : 0
  26. },
  27. "hits" : {
  28. "total" : 2,
  29. "max_score" : 1.4916549,
  30. "hits" : [
  31. {
  32. "_index" : "customer",
  33. "_type" : "doc",
  34. "_id" : "4",
  35. "_score" : 1.4916549,
  36. "_source" : {
  37. "name" : "李云龙",
  38. "id" : "510221197001013611",
  39. "addr" : "昆明市滇池路阳光时代1栋1单元",
  40. "tel" : "13808712808"
  41. }
  42. },
  43. {
  44. "_index" : "customer",
  45. "_type" : "doc",
  46. "_id" : "510221197001013611",
  47. "_score" : 1.4916549,
  48. "_source" : {
  49. "name" : "李云龙",
  50. "id" : "510221197001013611",
  51. "addr" : "上海市浦东区华北路8号",
  52. "tel" : "13908712808"
  53. }
  54. }
  55. ]
  56. }
  57. }

第三步:使用should,判断addr中必须有昆明市,这种情况下should子句会影响计分

  1. GET /customer/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": {
  6. "term":{"name.keyword":"李云龙"}
  7. },
  8. "filter": {
  9. "term": {
  10. "id": "510221197001013611"
  11. }
  12. },
  13. "should": [
  14. {"match": {
  15. "addr": "昆明市"
  16. }}
  17. ]
  18. }
  19. }
  20. }
  21. 返回结果中,地址是昆明市的文档score加重
  22. {
  23. "took" : 1,
  24. "timed_out" : false,
  25. "_shards" : {
  26. "total" : 1,
  27. "successful" : 1,
  28. "skipped" : 0,
  29. "failed" : 0
  30. },
  31. "hits" : {
  32. "total" : 2,
  33. "max_score" : 3.408528,
  34. "hits" : [
  35. {
  36. "_index" : "customer",
  37. "_type" : "doc",
  38. "_id" : "4",
  39. "_score" : 3.408528,
  40. "_source" : {
  41. "name" : "李云龙",
  42. "id" : "510221197001013611",
  43. "addr" : "昆明市滇池路阳光时代1栋1单元",
  44. "tel" : "13808712808"
  45. }
  46. },
  47. {
  48. "_index" : "customer",
  49. "_type" : "doc",
  50. "_id" : "510221197001013611",
  51. "_score" : 1.5720221,
  52. "_source" : {
  53. "name" : "李云龙",
  54. "id" : "510221197001013611",
  55. "addr" : "上海市浦东区华北路8号",
  56. "tel" : "13908712808"
  57. }
  58. }
  59. ]
  60. }
  61. }

第四步:加入must_not排除上海

  1. GET /customer/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": {
  6. "term":{"name.keyword":"李云龙"}
  7. },
  8. "filter": {
  9. "term": {
  10. "id": "510221197001013611"
  11. }
  12. },
  13. "should": [
  14. {"match": {
  15. "addr": "昆明市"
  16. }}
  17. ],
  18. "must_not": [
  19. {"match": {
  20. "addr": "上海"
  21. }}
  22. ]
  23. }
  24. }
  25. }
  26.  
  27. 只返回一个文档:
  28. {
  29. "took" : 2,
  30. "timed_out" : false,
  31. "_shards" : {
  32. "total" : 1,
  33. "successful" : 1,
  34. "skipped" : 0,
  35. "failed" : 0
  36. },
  37. "hits" : {
  38. "total" : 1,
  39. "max_score" : 3.408528,
  40. "hits" : [
  41. {
  42. "_index" : "customer",
  43. "_type" : "doc",
  44. "_id" : "4",
  45. "_score" : 3.408528,
  46. "_source" : {
  47. "name" : "李云龙",
  48. "id" : "510221197001013611",
  49. "addr" : "昆明市滇池路阳光时代1栋1单元",
  50. "tel" : "13808712808"
  51. }
  52. }
  53. ]
  54. }
  55. }

Elasticsearch Query DSL备忘(1)(Constant score query和Bool Query)的更多相关文章

  1. Query DSL for elasticsearch Query

    Query DSL Query DSL (资料来自: http://www.elasticsearch.cn/guide/reference/query-dsl/) http://elasticsea ...

  2. elasticsearch入门使用(三) Query DSL

    Elasticsearch Reference [6.2] » Query DSL 参考官方文档 :https://www.elastic.co/guide/en/elasticsearch/refe ...

  3. Elasticsearch Query DSL 整理总结(三)—— Match Phrase Query 和 Match Phrase Prefix Query

    目录 引言 Match Phase Query slop 参数 analyzer 参数 zero terms query Match Phrase 前缀查询 max_expansions 小结 参考文 ...

  4. 48.Query DSL

    主要知识点 1.Query DSL的理解及基本语法 2.如何组合多个搜索条件 bool     一.Query DSL的理解 Query DSL的查询形式如下: GET /_search { &quo ...

  5. elasticsearch系列四:搜索详解(搜索API、Query DSL)

    一.搜索API 1. 搜索API 端点地址 从索引tweet里面搜索字段user为kimchy的记录 GET /twitter/_search?q=user:kimchy 从索引tweet,user里 ...

  6. Elasticsearch使用备忘

    最近我们需要对大约2T(6.5亿条)日志做全文检索,Elasticsearch看起来很火爆,又有很多产品使用(Facebook.github.stackoverflow),值得一试.以下是一些基础知识 ...

  7. 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 ...

  8. Elasticsearch(入门篇)——Query DSL与查询行为

    ES提供了丰富多彩的查询接口,可以满足各种各样的查询要求.更多内容请参考:ELK修炼之道 Query DSL结构化查询 Query DSL是一个Java开源框架用于构建类型安全的SQL查询语句.采用A ...

  9. ElasticSearch的 Query DSL 和 Filter DSL

    Elasticsearch支持很多查询方式,其中一种就是DSL,它是把请求写在JSON里面,然后进行相关的查询. Query DSL 与 Filter DSL DSL查询语言中存在两种:查询DSL(q ...

随机推荐

  1. ORB-SLAM(八)ORBmatcher 特征匹配

    该类负责特征点与特征点之间,地图点与特征点之间通过投影关系.词袋模型或者Sim3位姿匹配.用来辅助完成单目初始化,三角化恢复新的地图点,tracking,relocalization以及loop cl ...

  2. Python-特殊变量

    from test import test ''' __mame__ __file__ __cache__ __package__ ''' # import os # 获取这个当前文件的绝对路径 # ...

  3. linux进程的学习笔记(未完)

    1. 进程是程序执行的一个实例,如果16个用户同时运行vi,那么有16个独立的进程,尽管它们共享同一个可执行代码,问题在于FreeRTOS这种系统,是否可以建2个相同的任务,需要注意什么?在linux ...

  4. 获取项目中.txt 文件的内容

    package com.fh.controller.ruitai.util; import java.io.BufferedInputStream; import java.io.File; impo ...

  5. 「日常训练」COMMON 约数研究(HYSBZ-1968)

    题意与分析 感谢https://www.cnblogs.com/Leohh/p/7512960.html的题解.这题话说原来不在我的训练范围,正好有个同学问我,我就拿来做做.数学果然不是我擅长的啊,这 ...

  6. VIN码识别:让VIN码采集so easy!

    近几年汽车后市场呈喷井式发展,在过去的半年,汽车后市场规模已高达万亿级,产业前景广阔,与此同时行业运营也受信息区域化.数据不统一的制约,让企业面临着效率低下.规模化运行困难的痛点. 在汽车配件市场中, ...

  7. 微信小程序—day02

    全局配置 在app.json中,对小程序进行全局配置.官方文档 tabBar是对底部/顶部导航栏的配置,图片的icon 大小限制为40kb,建议尺寸为 81px * 81px 去阿里矢量图网站,找到图 ...

  8. 七 Appium常用方法介绍

    文本转自:http://www.cnblogs.com/sundalian/p/5629609.html 由于appium是扩展了Webdriver协议,所以可以使用webdriver提供的方法,比如 ...

  9. 第八模块:算法&设计模式、企业应用 第1章 常用算法&设计模式学习

    第八模块:算法&设计模式.企业应用 第1章 常用算法&设计模式学习

  10. 初学Direct X(8) ——碰撞检测

    初学Direct X(8) --碰撞检测 真正让一个游戏鹤立鸡群的是程序对碰撞的响应有多好,这里介绍两种检测的方法: 1) 基于边框的碰撞检测 2) 基于距离的碰撞检测 1. 基于边框的碰撞检测 1. ...