ES提供了丰富多彩的查询接口,可以满足各种各样的查询要求。更多内容请参考:ELK修炼之道

Query DSL结构化查询

  • Query DSL是一个Java开源框架用于构建类型安全的SQL查询语句。采用API代替传统的拼接字符串来构造查询语句。目前Querydsl支持的平台包括JPA,JDO,SQL,Java Collections,RDF,Lucene,Hibernate Search。
  • elasticsearch提供了一整套基于JSON的查询DSL语言来定义查询。
  • Query DSL当作是一系列的抽象的查询表达式树(AST)特定查询能够包含其它的查询,(如 bool ), 有些查询能够包含过滤器(如 constant_score), 还有的可以同时包含查询和过滤器 (如 filtered). 都能够从ES支持查询集合里面选择任意一个查询或者是从过滤器集合里面挑选出任意一个过滤器, 这样的话,我们就可以构造出任意复杂(maybe 非常有趣)的查询了,是不是很灵活啊。

举个例子

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

查询的分类

Leaf query Cluase 叶子查询(简单查询)

这种查询可以单独使用,针对指定的字段查询指定的值。

Compound query clauses 复杂查询

复杂查询可以包含叶子或者其它的复杂查询语句,用于组合成复杂的查询语句,比如not, bool等。

**

查询虽然包含这两种,但是查询的行为还与查询的执行环境有关,不同的执行环境,查询操作也不一样。**

查询的行为取决于他们所在的查询上下文,包括Query查询上下文和Filter查询上下文。

查询与过滤

  • Query查询上下文

    在Query查询上下文中,查询会回答这个问题--"这个文档匹不匹配查询条件,它的相关性高么?"

    除了决定文档是够匹配,针对匹配的文档,查询语句还会计算一个_score相关性分值,分数越高,匹配度越高,默认返回是越靠前。这里关于分值的计算不再介绍,以后再做介绍。

  • Filter过滤器上下文

    在Filter过滤器上下文中,查询会回答这个问题--"这个文档是否匹配"

    这个结果要么“不是”要么“是”,不会计算分值问题,也不会关心返回的排序问题,这样性能方面就比Query查询高了。Filter过滤器主要用于过滤结构化数据,例如:

    • 时间戳范围是否在2015-2016之间?
    • status字段是否被设置成"published"?

      另外,常用的过滤器会自动缓存Elasticsearch,加速性能。

举个简单的例子:

  1. title字段包含关键词"search"
  2. content字段包含关键词"elasticsearch"
  3. status字段存在精确词"published"
  4. publish_date字段包含一个日期由2015年1月1日起
GET _search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Search" }},
{ "match": { "content": "Elasticsearch" }}
],
"filter": [
{ "term": { "status": "published" }},
{ "range": { "publish_date": { "gte": "2015-01-01" }}}
]
}
}
}

性能差异

使用过滤语句得到的结果集———一个简单的文档列表,快速匹配运算并存入内存是非常方便的,每个文档仅需1个字节。这些缓存的过滤结果集与后续请求的结合使用时非常高效的。

查询语句不仅要查找相匹配的文档,还需要计算每个文档的相关性,所以一般来说查询语句要比过滤语句更耗时,并且查询结果也不可缓存。

幸亏有了倒排索引,一个只匹配少量文档的简单查询语句在百万级文档中的查询效率会与一条经过缓存的过滤语句旗鼓相当,甚至略占上风。但是一般情况下,一条经过缓存的过滤查询要远胜一条查询语句的执行效率。

总结

  1. Query查询上下文中,查询操作会根据查询的结果进行相关性分值计算,用于确定相关性。分值越高,返回的结果越靠前。
  2. Filter过滤器上下文中,查询不会计算相关性分值,也不会对结果进行排序。
  3. 过滤器上下文中,查询的结果可以被缓存。
  4. 以后博客中提到的查询就是在Query查询上下文,过滤就是指filter过滤器上下文。
  5. 原则上来说,使用查询语句做全文本搜索或其他需要进行相关性评分的时候,剩下的全部用过滤语句

参考

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-filter-context.html

Elasticsearch(入门篇)——Query DSL与查询行为的更多相关文章

  1. 转载:elasticsearch入门篇

    转自:https://www.cnblogs.com/hello-shf/p/11543408.html elasticsearch入门篇   elasticsearch专栏:https://www. ...

  2. ElasticSearch入门篇Ⅰ --- ES核心知识概括

    C01.什么是Elasticsearch 1.什么是搜索 垂直搜索(站内搜索) 互联网的搜索:电商网站,招聘网站,各种app IT系统的搜索:OA软件,办公自动化软件,会议管理,员工管理,后台管理系 ...

  3. Elasticsearch入门篇

    推荐博客: 阮一峰大神:http://www.ruanyifeng.com/blog/2017/08/elasticsearch.html ElasticSearch 权威指南(中文版):https: ...

  4. python 查询 elasticsearch 常用方法(Query DSL)

    1. 建立连接 from elasticsearch import Elasticsearch es = Elasticsearch(["localhost:9200"]) 2. ...

  5. elasticsearch 入门篇

    前言: 要论入门最好的文档,非elasticsearch权威指南和官方的开发文档莫属,我只是基于这两份文档,记录一些关键知识点和自己的理解. 我们为什么要用elasticsearch,或者说来解决什么 ...

  6. ElasticSearch入门篇(保姆级教程)

    本章将介绍:ElasticSearch的作用,搭建elasticsearch的环境(Windows/Linux),ElasticSearch集群的搭建,可视化客户端插件elasticsearch-he ...

  7. mybatis入门篇:Mybatis高级查询

    1.ResultMap的association与collection association与collection功能类似,区别是一对一与一对多,这里以association为例. 首先说明一下需求: ...

  8. ElasticSearch的 Query DSL 和 Filter DSL

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

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

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

随机推荐

  1. node.js开发中使用Node Supervisor实现监测文件修改并自动重启应用提高nodejs调试效率

    在开发或调试Node.js应用程序的时候,当你修改js文件后,总是要按下CTRL+C终止程序,然后再重新启动,即使是修改一点小小的参数,也 总是要不断地重复这几个很烦人的操作.这是因为Node.js ...

  2. kinderEditor + Struts2整合

    环境: kinderEditor4.1.5 Struts2.3.5 Spring3.0.5 Hibernate3.6 代码: FileManageAction package com.hcsoft.p ...

  3. 1022. Digital Library (30)

    A Digital Library contains millions of books, stored according to their titles, authors, key words o ...

  4. MarkMan – 马克鳗,让设计更有爱!

    scavin(Google+) on 2010.11.16. MarkMan – 马克鳗 是一款方便高效的标注工具,极大节省设计师在设计稿上添加和修改标注的时间,让设计更有爱.Adobe AIR 平台 ...

  5. 配置RAC到单节点standby的data guard

    1RAC主库准备 2创建物理备库 3主库调整参数 4测试DG

  6. 织梦5.7 TAG、标题、栏目以及keywords长度字符数限制修改

    织梦5.7 TAG.标题.栏目以及keywords长度字符数限制修改[图文]   标签: 织梦关键词长度修改 织梦tag长度修改 织梦标题长度修改 织梦栏目长度限制修改 织梦修改 分类: 技术操作   ...

  7. Lambda表达式动态拼接(备忘)

    EntityFramework动态组合Lambda表达式作为数据筛选条件,代替拼接SQL语句 分类: C# Lambda/Linq Entity Framework 2013-05-24 06:58 ...

  8. Linux LVM过程问题

    问题: 使用fdisk 修改完成磁盘后,在/etc/下没有出现新建的分区文件 解决: 重启系统 (好吧,这他妈也算解决方案~~)

  9. php课程---Json格式规范需要注意的小细节

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机器解析和生成. 它基于JavaScript Programming Lan ...

  10. html5:地理信息 LBS基于地理的服务和百度地图API的使用

    地理位置请求 单次定位请求getCurrentPosition(请求成功函数,请求失败函数,数据收集方式) 多次定位请求watchPosition(请求成功函数,请求失败函数,数据收集方式) 关闭更新 ...