文章目录

  • DSL介绍
  • Match all query
  • 全文查询
    • match query
    • match phrase query
    • match phrase prefix query
    • multi match query
    • query string query
    • simple query string query
  • 词项查询
    • term query
    • terms query
    • range query
    • exits query
    • prefix query 词项前缀查询
    • wildcard query 通配符查询
    • regexp query 正则查询
    • fuzzy query 模糊查询
    • ids 根据文档id查询
  • 复合查询
    • constant score query
    • bool query

官网介绍链接: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html

DSL介绍

Domain Specific Language:领域特定语言

Elasticsearch基于JSON提供完整的查询DSL来定义查询。

一个查询可由两部分字句构成:

  • Leaf query clauses 叶子查询字句:Leaf query clauses 在指定的字段上查询指定的值, 如:match, term or range queries. 叶子字句可以单独使用.
  • Compound query clauses 复合查询字句:以逻辑方式组合多个叶子、复合查询为一个查询

一个查询字句的行为取决于它是用在query context 还是 filter context 中:

  • Query context 查询上下文:用在查询上下文中的字句回答“这个文档有多匹配这个查询?”。除了决定文档是否匹配,字句匹配的文档还会计算一个字句评分,来评定文档有多匹配,会参与相关性评分。查询上下文由 query 元素表示。
  • Filter context 过滤上下文:过滤上下文由 filter 元素或 bool 中的 must not 表示。用在过滤上下文中的字句回答“这个文档是否匹配这个查询?”,不参与相关性评分。被频繁使用的过滤器将被ES自动缓存,来提高查询性能。

如下语句:

GET /_search
{"query": { "bool": { "must": [{ "match": { "title":   "Search"        }}, { "match": { "content": "Elasticsearch" }}  ],"filter": [ { "term":  { "status": "published" }}, { "range": { "publish_date": { "gte": "2015-01-01" }}} ]}}
}

query负责在查询上下文中使用查询字句来表示影响匹配文档得分的条件,filter负责在过滤上下文中使用所有其他查询字句

Match all query

查询所有

GET /_search
{"query": {"match_all": {}}
}GET /_search
{"query": {"match_none": {}}
}

全文查询

官网:https://www.elastic.co/guide/en/elasticsearch/reference/current/full-text-queries.html

全文查询,用于对分词的字段进行搜索。会用查询字段的分词器对查询的文本进行分词生成查询。可用于短语查询、模糊查询、前缀查询、临近查询等查询场景。

match query

全文查询的标准查询,它可以对一个字段进行模糊、短语查询。 match queries 接收 text/numerics/dates, 对它们进行分词分析, 再组织成一个boolean查询。可通过operator 指定bool组合操作(or、and 默认是 or ), 以及minimum_should_match 指定至少需多少个should(or)字句需满足。还可用ananlyzer指定查询用的特殊分析器。

GET /_search
{"query": {"match" : {"message" : "this is a test"  #message是字段名}}
}

新增两个文档:

PUT /ftq/_doc/1
{"title": "lucene solr and elasticsearch","content": "lucene solr and elasticsearch for search"
}PUT /ftq/_doc/2
{"title": "java spring boot","content": "lucene is writerd by java"
}

执行查询:

GET ftq/_search
{"query": {"match": {"title": "lucene java"  #分词后用or}}
}GET ftq/_search
{"query": {"match": {"title": {"query": "lucene java","operator": "and"  #指定分词后用and}}}
}

模糊查询,可以指定fuzziness最大编辑数

  • 最大编辑数为2,说明query字符串中分词后,每个词允许编辑两次单个字符,可删除、新增、修改字符
  • fuzziness 参数可以被设置为 AUTO,此时字符串只有 1 到 2 个字符时是 0;字符串有 3 、4 或者 5 个字符时是 1;字符串大于 5 个字符时是 2
  • 有时编辑距离 2 仍然是太多了,返回的结果似乎并不相关。 把最大 fuzziness 设置为 1 ,可以得到更好的结果和更好的性能
GET ftq/_search
{"query": {"match": {"title": {"query": "ucen elatic","fuzziness": 2}}}
}

关于模糊查询fuzziness的说明,可以参看:https://www.elastic.co/guide/cn/elasticsearch/guide/current/fuzziness.html


还可以使用minimum_should_match指定最少需要满足几个词匹配:

GET ftq/_search
{"query": {"match": {"content": {"query": "ucen elatic java","fuzziness": 2,"minimum_should_match": 2}}}
}

还可用max_expansions 指定模糊匹配的最大词项数,默认是50。比如:反向索引中有 100 个词项与 ucen 模糊匹配,只选用前50 个。

GET ftq/_search
{"query": {"match": {"content": {"query": "ucen elatic java","fuzziness": 2,"minimum_should_match": 2,"max_expansions ": 50}}}
}

match phrase query

match_phrase 查询用来对一个字段进行短语查询,可以指定 analyzer、slop移动因子。

GET ftq/_search
{"query": {"match_phrase": {"title": "lucene solr"}}
}GET ftq/_search
{"query": {"match_phrase": {"title": {"query": "lucene elasticsearch","slop": 2}}}
}

match phrase prefix query

match_phrase_prefix 在 match_phrase 的基础上支持对短语的最后一个词进行前缀匹配

查询f开头的:

GET /_search
{"query": {"match_phrase_prefix" : {"message" : "quick brown f"}}
}

指定前缀匹配选用的最大词项数量:

GET /_search
{"query": {"match_phrase_prefix" : {"message" : {"query" : "quick brown f","max_expansions" : 10}}}
}

multi match query

如果你需要在多个字段上进行文本搜索,可用multi_match 。multi_match在 match的基础上支持对多个字段进行文本查询。

GET ftq/_search
{"query": {"multi_match" : {"query":    "lucene java", "fields": [ "title", "content" ] }}
}

还可以使用*匹配多个字段:

GET ftq/_search
{"query": {"multi_match" : {"query":    "lucene java", "fields": [ "title", "cont*" ] }}
}

query string query

query_string 查询,让我们可以直接用lucene查询语法写一个查询串进行查询,ES中接到请求后,通过查询解析器解析查询串生成对应的查询。使用它要求掌握lucene的查询语法。

GET /_search
{"query": {"query_string" : {"default_field" : "content","query" : "this AND that OR thus"}}
}GET /_search
{"query": {"query_string" : {"fields" : ["content", "name"],"query" : "this AND that OR thus"}}
}

可与query同用的参数,如 default_field、fields,及query 串的语法请参考:
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html

simple query string query

simple_query_string 查同 query_string 查询一样用lucene查询语法写查询串,较query_string不同的地方:更小的语法集;查询串有错误,它会忽略错误的部分,不抛出错误。更适合给用户使用。

GET /_search
{"query": {"simple_query_string" : {"query": "\"fried eggs\" +(eggplant | potato) -frittata","fields": ["title^5", "body"],"default_operator": "and"}}
}

语法请参考:
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-simple-query-string-query.html

词项查询

官网:https://www.elastic.co/guide/en/elasticsearch/reference/current/term-level-queries.html

term query

term 查询用于查询指定字段包含某个词项的文档。

POST _search
{"query": {"term" : { "user" : "Kimchy" } }
}

terms query

terms 查询用于查询指定字段包含某些词项的文档。

GET /_search
{"query": {"terms" : { "user" : ["kimchy", "elasticsearch"]}}
}

Terms 查询支持嵌套查询的方式来获得查询词项,相当于 in (select term from other)

PUT /users/_doc/2
{"followers" : ["1", "3"]
}PUT /tweets/_doc/1
{"user" : "1"
}GET /tweets/_search
{"query" : {"terms" : {"user" : {"index" : "users","type" : "_doc","id" : "2","path" : "followers"}}    }
}

嵌套查询可用参数说明:

range query

范围查询

  • gte:大于等于
  • gt:大于
  • lte:小于等于
  • lt:小于
  • boost:查询权重
GET _search
{"query": {"range" : {"age" : {"gte" : 10,"lte" : 20,"boost" : 2.0}}}
}GET _search
{"query": {"range" : {"date" : {"gte" : "now-1d/d",  #当前时间减1天后转成天数"lt" :  "now/d"  #当前时间转成条数}}}
}GET _search
{"query": {"range" : {"born" : {"gte": "01/01/2012","lte": "2013","format": "dd/MM/yyyy||yyyy"}}}
}

时间舍入||说明:

  • gt:大于的情况下,四舍五入,比如2014-11-18||/M变成2014-11-30T23:59:59:999,不包含整个月
  • gte:大于等于的情况下,向下取整,比如2014-11-18||/M变成2014-11-01,包含整个月
  • lt:小于的情况下,向下取整,比如2014-11-18||/M变成2014-11-01,不包含整个月
  • lte:小于等于的情况下,四舍五入,比如2014-11-18||/M变成2014-11-30T23:59:59:999,包含整个月

时间数学计算规则请参考:
https://www.elastic.co/guide/en/elasticsearch/reference/current/common-options.html#date-math

exits query

查询指定字段值不为空的文档。相当 SQL 中的 column is not null

GET /_search
{"query": {"exists" : { "field" : "user" }}
}

prefix query 词项前缀查询

GET /_search
{ "query": {"prefix" : { "user" : "ki" }}
}

wildcard query 通配符查询

GET /_search
{"query": {"wildcard" : { "user" : "ki*y" }}
}GET /_search
{"query": {"wildcard": {"user": {"value": "ki*y","boost": 2}}}}

regexp query 正则查询

GET /_search
{"query": {"regexp":{"name.first": "s.*y"}}
}GET /_search
{"query": {"regexp":{"name.first":{"value":"s.*y","boost":1.2}}}
}

正则语法参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-regexp-query.html#regexp-syntax

fuzzy query 模糊查询

GET /_search
{"query": {"fuzzy" : { "user" : "ki" }}
}GET /_search
{"query": {"fuzzy" : {"user" : {"value": "ki","boost": 1.0,"fuzziness": 2,"prefix_length": 0,"max_expansions": 100}}}
}

ids 根据文档id查询

GET /_search
{"query": {"ids" : {"type" : "_doc","values" : ["1", "4", "100"]}}
}

复合查询

官网:https://www.elastic.co/guide/en/elasticsearch/reference/current/compound-queries.html

constant score query

用来包装另一个查询,将查询匹配的文档的评分设为一个常值。

GET /_search
{"query": {"constant_score" : {"filter" : {"term" : { "user" : "kimchy"}},"boost" : 1.2}}
}

bool query

Bool 查询用bool操作来组合多个查询字句为一个查询。 可用的关键字:

  • must:必须满足
  • filter:必须满足,但执行的是filter上下文,不参与、不影响评分
  • should:或
  • must_not:必须不满足,在filter上下文中执行,不参与、不影响评分
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}}
}

Elasticsearch搜索引擎第十篇-Query DSL详解相关推荐

  1. SpringBoot第十篇:thymeleaf详解

    作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/10931435.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言   Sprin ...

  2. AUTOSAR从入门到精通100讲(四十九)-AUTOSAR 通信服务Dcm篇-Dcm概念及DSL详解与实战案例

    Dcm概念及DSL详解 正文 1. Introduction and functional overview 诊断通信管理(Diagnostic Communication Manager, DCM) ...

  3. MySQL数据库,从入门到精通:第十四篇——MySQL视图详解

    MySQL数据库,从入门到精通:第十四篇--MySQL视图详解 第 14 篇_视图 1. 常见的数据库对象 2. 视图概述 2. 1 为什么使用视图? 2. 2 视图的理解 3. 创建视图 3. 1 ...

  4. MySQL数据库,从入门到精通:第十二篇——MySQL数据类型详解

    MySQL数据库,从入门到精通:第十二篇--MySQL数据类型详解 第 12 章_MySQL数据类型精讲 1. MySQL中的数据类型 2. 整数类型 2. 1 类型介绍 2. 2 可选属性 2. 2 ...

  5. mysql入门优化_MySQL数据库:MySQL十大优化技巧详解

    本文主要向大家介绍了MySQL数据库的MySQL十大优化技巧详解,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. WEB开发者不光要解决程序的效率问题,对数据库的快速访问和相应也是 ...

  6. 大数据是什么和大数据技术十大核心原理详解

     一.数据核心原理   从"流程"核心转变为"数据"核心   大数据时代,计算模式也发生了转变,从"流程"核心转变为"数据&quo ...

  7. 即时通讯音视频开发(十八):详解音频编解码的原理、演进和应用选型

    1.引言 大家好,我是刘华平,从毕业到现在我一直在从事音视频领域相关工作,也有一些自己的创业项目,曾为早期Google Android SDK多媒体架构的构建作出贡献. 就音频而言,无论是算法多样性, ...

  8. Gartner:2018年十大安全项目详解

    Gartner 2018年十大安全项目详解 Last Modified By Bennyye @ 2018-11-20 1     概述 2018年6月份,一年一度的Gartner安全与风险管理峰会上 ...

  9. 大数据技术十大核心原理详解

    一.数据核心原理--从"流程"核心转变为"数据"核心 大数据时代,计算模式也发生了转变,从"流程"核心转变为"数据"核心 ...

最新文章

  1. 关于Activity class {package/class} does not exist
  2. Leetcode 118:Pascal's Triangle 杨辉三角
  3. 软件外包项目管理的经验感悟
  4. asp.net中page对象生命周期和各事件执行顺序
  5. Oracle JDK 和 OpenJDK 有什么区别?
  6. offset系列,client系列,scroll系列回顾
  7. 在java web工程中jsp页面中使用kindeditor
  8. python编辑器_推荐一款Python编辑器,集Pycharm和Sublime优点于一身的王者
  9. React之事件处理
  10. python进阶05并发之一基本概念
  11. AS3程序性能优化建议
  12. IE10 CSS hack
  13. 渗透测试-postmessage xss
  14. 西门子系列PLC教学视频资源4——S7-1200
  15. Visual Studio 2013安装教程
  16. seaweedfs入门
  17. 免费FTP资源(比较全)
  18. 【第二届PHP全球开发者大会】惠新宸(鸟哥):PHP7性能之源
  19. Gazebo物理仿真环境搭建 实例
  20. 微信公众平台模拟登录自动群发图文消息工具包

热门文章

  1. 万家杨柳青烟里:B+、B- 树的应用场景
  2. 基于c语言矩阵数组透视变换,一种图像透视变换方法与流程
  3. php内容怎么设置隐藏,在PHP中设置隐藏元素的值 - php
  4. 如何在短时间内成为数据分析师
  5. Python正则表达式 .,[],\d,\w,\s,\S,\D,\W的用法
  6. 帝国建站php,帝国cms支持php吗
  7. javaweb编辑器ckeditor配置_ckeditor (一)在java web中的配置
  8. 第一个Python程序-HelloWorld与Python解释器
  9. Flask-SocketIO的使用
  10. HBase+Spark技术双周刊第一期