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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏乐沙弥的世界

ORA-39126 KUPW$WORKER.PUT_DDLS [TABLE_STATISTICS]错误

--======================================================= -- ORA-39126 KUPW$WOR...

1484
来自专栏分布式系统和大数据处理

Hive中分区和分桶的概念和操作

在使用传统的RDBMS数据库(关系数据库),例如MySql时,对于一些大表,我们通常会进行分表操作,以提升查询效率。在Hive中也提供了类似的概念和操作,本文将...

1631
来自专栏乐沙弥的世界

SQL*Plus copy 命令处理大批量数据复制

    对于数据库表级上的数据复制,我们最常用的是CREATE TABLE AS(CTAS)..方式。其实在SQL*Plus下面copy命令可以完成同样的工作,...

951
来自专栏Hadoop数据仓库

Oracle 索引的分类

看到 itpub 论坛上的一个帖子,对 Oracle 的索引分类总结得言简意赅,于是收藏过来。又补充了一点RAC用到的反向索引的东西。 逻辑上:  Single...

1929
来自专栏抠抠空间

地理位置geo处理之mysql函数

原文:https://www.jianshu.com/p/455d0468f6d4

941
来自专栏祥子的故事

HIVE窗口函数

CSDN博客地址:https://mp.csdn.net/mdeditor/81067060

2744
来自专栏恰同学骚年

《T-SQL查询》读书笔记Part 1.逻辑查询处理知多少

  T-SQL是ANSI和ISO SQL标准的MS SQL扩展,其正式名称为Transact-SQL,但一般程序员都称其为T-SQL。

914
来自专栏java达人

Oracle执行计划详解

简介: 本文全面详细介绍oracle执行计划的相关的概念,访问数据的存取方法,表之间的连接等内容。 并有总结和概述,便于理解与记忆! +++ 目录 ...

1877
来自专栏乐沙弥的世界

dbms_xplan之display函数的使用

DBMS_XPLAN包包括一系列函数,主要是用于显示SQL语句的执行计划,且不同的情形下使用不同的函数来显示,如预估的执行计划则使用 displ...

1712
来自专栏乐沙弥的世界

基于 dbms_redefinition 在线重定义表

      Oracle 支持在线重定义表,也就是说我们可以在修改表结构(DDL)的同时进行相关的DQL、DML操作,使得前端的DML根本感觉不到表结构实际上已...

1072

扫码关注云+社区

领取腾讯云代金券