欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Elasticsearch Query DSL 整理总结(一)—— Query DSL 概要,MatchAllQuery,全文查询简述

程序员文章站 2022-05-11 14:44:04
[TOC] 引言 虽然之前做过 elasticsearch 的项目,但是没有对整个项目的知识点进行过系统的整理。这次趁着对 elasticsearch 版本的升级的机会(从2.2 升级到 6.3) ,又专门花时间对涉及到的知识点重新梳理了一遍。 俗话说, 好记性不如烂笔头 。为了加深对 elasti ......

目录

引言

虽然之前做过 elasticsearch 的项目,但是没有对整个项目的知识点进行过系统的整理。这次趁着对 elasticsearch 版本的升级的机会(从2.2 升级到 6.3) ,又专门花时间对涉及到的知识点重新梳理了一遍。

俗话说,好记性不如烂笔头。为了加深对 elasticsearch 的理解,后面再做类似项目时更容易捡起来,以及对用到的同学提供方便。从本文开始,我会对 elasticsearch query dsl 的知识点进行梳理。

在讲解时我会尽量以实例代码展示的方式进行最直观的展现。纸上来得终觉浅,绝知此事要躬行。做技术尤其要注重多实践,懂了并不代表你就掌握了。强烈建议有志于深入了解这部分内容的同学,对文中给出的代码实例在 中实践一遍甚至是多遍。

注意: 本文基于 elasticsearch 6.3 版本, 如果您使用的是其他版本,一些内容可能会有所变化,具体使用时还请以为准

query dsl 是 elasticsearch 的核心,搜索方面的项目大部分时间都耗费在对查询结果的调优上。因此对 query dsl 的理解越深入,越能节省项目时间,并给用户好的体验。

概要

elasticsearch 提供了一个完整的 query dsl,并且是 json 形式的。它和 ast 比较类似,并且包含两种类型的语句:

  • 叶子查询语句(leaf query)

    用于查询某个特定的字段,如 match , termrange

  • 复合查询语句 (compound query clauses)

    用于合并其他的叶查询或复合查询语句,也就是说复合语句之间可以嵌套,用来表示一个复杂的单一查询

dsl (domain-specific language),领域特定语言指的是专注于某个应用程序领域的计算机语言,又译作领域专用语言。不同于普通的跨领域通用计算机语言(gpl),领域特定语言只用在某些特定的领域。

ast(abstract syntax tree), 抽象语法树是源代码的抽象语法结构的树形表现形式。树上的每个节点都表示源代码中的一种结构。之所以说语法是“抽象”的,是因为这里的语法并不会表示出真实语法中出现的每个细节。比如,嵌套括号被隐含在树的结构中,并没有以节点的形式呈现;而类似于if-condition-then这样的条件跳转语句,可以使用带有两个分支的节点来表示。

——百度百科

query and filter context

一个查询语句究竟具有什么样的行为和得到什么结果,主要取决于它到底是处于查询上下文(query context) 还是过滤上下文(filter context)。两者有很大区别,我们来看下:

  • query context 查询上下文

    这种语句在执行时既要计算文档是否匹配,还要计算文档相对于其他文档的匹配度有多高,匹配度越高,*_score* 分数就越高

  • filter context 过滤上下文

    过滤上下文中的语句在执行时只关心文档是否和查询匹配,不会计算匹配度,也就是得分。

下面来看一个例子

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

对上面的例子分析下:

  1. query 参数表示整个语句是处于 query context 中
  2. boolmatch 语句被用在 query context 中,也就是说它们会计算每个文档的匹配度(_score)
  3. filter 参数则表示这个子查询处于 filter context 中
  4. filter 语句中的 termrange 语句用在 filter context 中,它们只起到过滤的作用,并不会计算文档的得分。

match all query

这个查询最简单,所有的 _score 都是 1.0。

get /_search
{
    "query": {
        "match_all": {}
    }
}

它的反面就是 match none query, 匹配不到任何文档(不知道用它来做什么……)

get /_search
{
    "query": {
        "match_none": {}
    }
}

全文查询 full text queries

全文本查询的使用场合主要是在出现大量文字的场合,例如 email body 或者文章中搜寻出特定的内容。

全文查询主要分为下面几种(此处列表中的链接为官方文档链接,后续将各部分讲解后,会替换为讲解链接):

  • 全文查询中最主要的查询,包括模糊查询(fuzzy matching) 或者临近查询(proximity queries)。

  • match 查询比较类似,但是它会保留包含所有搜索词项,且位置与搜索词项相同的文档。

  • 是一种输入即搜索(search-as-you-type) 的查询,它和 match_phrase 比较类似,区别就是会将查询字符串的最后一个词作为前缀来使用。

  • 多字段版本的 match query

  • 只知道是一种特殊的查询,具体干什么还不清楚,后面弄明白后会再来补充。

  • 支持复杂的 lucene query string 语法,除非你是专家用户,否则不推荐使用。

  • 简化版的 query_string ,语法更适合用户操作。

小结

本文主要讲解了 elasticsearch es 6.3 版本的 query dsl 概要,match all query ,

全文查询概要等内容。下篇会介绍全文查询中的 match 语句,敬请期待。

参考文档