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

引言

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

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

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

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

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

概要

Elasticsearch 提供了一个完整的 query DSL,而且是 JSON 形式的。它和 AST 比较相似,而且包含两种类型的语句:code

  • 叶子查询语句(Leaf Query)htm

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

  • 复合查询语句 (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 或者文章中搜寻出特定的内容。

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

  • match query

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

  • match_phrase query

    match 查询比较相似,可是它会保留包含全部搜索词项,且位置与搜索词项相同的文档。

  • match_phrase_prefix query

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

  • multi_match query

    多字段版本的 match query

  • common terms query

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

  • query_string query

    支持复杂的 Lucene query String 语法,除非你是专家用户,不然不推荐使用。

  • simple_query_string query

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

小结

本文主要讲解了 elasticsearch es 6.3 版本的 Query DSL 概要,Match All Query ,

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

参考文档

  1. elasticsearch 6.3 query-dsl
相关文章
相关标签/搜索