0. 引言

Elasticsearch 提供了强大的查询语言 Query DSL(Domian Specific Language)。Query DSL 是基于 JSON 数据格式来描述查询条件。本文的主要介绍如何使用 Query DSL ,包括语法规则和字段使用,同时配有相应例子供大家参考。

Elasticsearch 查询规则分为两类:Query context (查询上下文) 和 Filter context (过滤上下文)。他们对查询结果有不同的影响。Query 影响查询结果的相关性评分。Elasticsearch 会计算每条查询结果的相关性评分(relevance score),并按评分对结果进行排序。Filter 要求结果完全匹配 filter context 设置的查询条件,不会影响相关性评分。我们可以通过下面例子初步认识 Elasticsearch 查询语音。该查询语句会匹配满足全部以下条件的文档:

  • title 字段包含单词 search
  • content 字段包含单词 elasticsearch
  • status 字段为 published
  • publish_date 字段大于 2015 年 1 月
GET /_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "title":   "Search"        }},
        { "match": { "content": "Elasticsearch" }}
      ],
      "filter": [
        { "term":  { "status": "published" }},
        { "range": { "publish_date": { "gte": "2015-01-01" }}}
      ]
    }
  }
}

命中一条结果:

{
    "took": 3,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 1,
            "relation": "eq"
        },
        "max_score": 0.5753642,
        "hits": [
            {
                "_index": "twitter",
                "_type": "1",
                "_id": "NpI0tGwBw88r7mqtr8EN",
                "_score": 0.5753642,
                "_source": {
                    "title": "My Search",
                    "content": "trying out Elasticsearch",
                    "status": "published",
                    "publish_date": "2019-11-15T14:12:12"
                }
            }
        ]
    }
}

接下来,我们就几种常见的查询场景依次介绍。

1. 组合查询

组合查询(Compound Queries)中的 bool query 用于在多个字段上进行组合查询,是一个查询中包含多个查询条件的查询。组合查询接受四种布尔匹配

  • must:必须匹配
  • filter:必须匹配(但对评分没有影响)
  • should:如果匹配,将增加相关性评分
  • must_not:必须不匹配(对评分贡献为0)

每一个子查询都独自地计算文档的相关性得分。每个文档的最终得分 _score 是各个分数的总合。以下是一个典型例子:

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
    }
  }
}

注:minimum_should_match 表示至少要满足的 should 语句。例子中有两条 should 语句,要求至少满足一条。

2. 全文搜索

2.1 Match

匹配查询(match query)也是布尔类型的查询。匹配查询会构造一个布尔查询来分析文本。布尔语句之间关系由 operator 字段定义,可选值为 or 和 and,默认是 or。如果是 or 的话,可以使用 minimum_should_match 来设置至少要匹配的 should 语句数量(默认为 1,至少一条)。

以下是一个典型例子。"this is a test" 是查询字符串。match 查询首先将查询字符串解析成一个词项列表,单词之间以非数字字母字符隔开。然后对这些词项进行搜索。筛选出 message 文本中包含`this、is 、a 或 test 至少一个单词的文档。

GET /_search
{
    "query": {
        "match" : {
            "message" : "this is a test"
        }
    }
}

等价于

GET /_search
{
   "query": {
       "bool" : {
           "should": [
               { "term": { "message": "this" }},
               { "term": { "message": "is" }},
               { "term": { "message": "a" }},
               { "term": { "message": "test" }},
           ]
       }
   }
}

2.2 Match Phase

短语匹配(match_phrase query)与匹配查询(match query)类似。但查询结果只保留那些包含全部搜索词项,且位置与搜索词项相同的文档。下面例子仅匹配 title 文本中包含 quick brown fox 短语的文档,且顺序不可变,中间不能夹带其他单词。

什么是短语?

一个被认定为和短语 quick brown fox 匹配的文档,必须满足以下这些要求:

  • quick 、 brown 和 fox 需要全部出现在域中。
  • brown 的位置应该比 quick 的位置大 1 。
  • fox 的位置应该比 quick 的位置大 2 。

如果以上任何一个选项不成立,则该文档不能认定为匹配。

GET /my_index/my_type/_search
{
    "query": {
        "match_phrase": {
            "title": "quick brown fox"
        }
    }
}

2.3 Multi Match

多字段匹配(multi_match query)是基于 match query 之上,允许同一查询作用在多个字段上。以下例子, match query 同时作用在字段 title 和 以 _name 结尾的字段,比如 first_name 和 last_name。

GET /_search
{
  "query": {
    "multi_match" : {
      "query":    "Will Smith",
      "fields": [ "title", "*_name" ]
    }
  }
}

2.4 Query String

查询字符串(query string)支持使用查询字符串语言(Query string syntax)来设置查询条件。

以下例子使用了查询字符串语言,表达式为 (new york city) OR (big apple)。相当于执行两条 match query,查询字符串分别是 new york city 和 big apple。如果要完整匹配短语的话,可以使用引号限定,比如 (new york city) OR ("big apple") 。

GET /_search
{
    "query": {
        "query_string" : {
            "query" : "(new york city) OR (big apple)",
            "default_field" : "content"
        }
    }
}

2.5 Simple Query String

Query String 如果表达式不合法会返回错误。在实际使用中,一般建议使用 Simple Query String。

3. 词项查询

词项查询(term-level queries)基于词项的查询如 term 或 fuzzy 查询不需要分析阶段,它们对单个词项进行操作。查用的词项查询类型有:

3.1 Range query

返回字段在指定范围内的文本

GET _search
{
    "query": {
        "range" : {
            "age" : {
                "gte" : 10,
                "lte" : 20,
                "boost" : 2.0
            }
        }
    }
}

3.2 Term query

返回字段完全匹配指定词项的文档。对于 text 类型的字段查询,建议使用 match query

GET /_search
{
    "query": {
        "term": {
            "user": {
                "value": "Kimchy",
                "boost": 1.0
            }
        }
    }
}

Elasticsearch Query DSL 语言介绍的更多相关文章

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

    目录 引言 概要 Query and filter context Match All Query 全文查询 Full text queries 小结 参考文档 引言 虽然之前做过 elasticse ...

  2. Elasticsearch Query DSL

    Elasticsearch Query DSL By:授客 QQ:1033553122 1. match_all 1 2. match 2 3. match_phrase 5 4. match_phr ...

  3. Elasticsearch Query DSL 整理总结(二)—— 要搞懂 Match Query,看这篇就够了

    目录 引言 构建示例 match operator 参数 analyzer lenient 参数 Fuzziness fuzzniess 参数 什么是模糊搜索? Levenshtein Edit Di ...

  4. Elasticsearch Query DSL(查询语言)

    章节 Elasticsearch 基本概念 Elasticsearch 安装 Elasticsearch 使用集群 Elasticsearch 健康检查 Elasticsearch 列出索引 Elas ...

  5. Elasticsearch Query DSL查询入门

    本篇为学习DSL时做的笔记,适合ES新手,大佬请略过~ Query DSL又叫查询表达式,是一种非常灵活又富有表现力的查询语言,采用JSON接口的方式实现丰富的查询,并使你的查询语句更灵活.更精确.更 ...

  6. Elasticsearch Query DSL 整理总结(三)—— Match Phrase Query 和 Match Phrase Prefix Query

    目录 引言 Match Phase Query slop 参数 analyzer 参数 zero terms query Match Phrase 前缀查询 max_expansions 小结 参考文 ...

  7. Elasticsearch Query DSL备忘(1)(Constant score query和Bool Query)

    Query DSL (Domain Specific Language),基于json的查询方式 1.Constant score query,常量分值查询,目的就是返回指定的score,一般都结合f ...

  8. Elasticsearch Query DSL 整理总结(四)—— Multi Match Query

    目录 引言 概要 fields 字段 通配符 提升字段权重 multi_match查询的类型 best_fields 类型 dis_max 分离最大化查询 best_fields 维权使者 tie_b ...

  9. elasticsearch query dsl

    1.match / match_phrase / match_phrase_prefix / multi_match[查询] 1.1 match 它会根据所给的字符串,进行分词,然后去找出,包含这些分 ...

随机推荐

  1. [CodeForces-1225B] TV Subscriptions 【贪心】【尺取法】

    [CodeForces-1225B] TV Subscriptions [贪心][尺取法] 标签: 题解 codeforces题解 尺取法 题目描述 Time limit 2000 ms Memory ...

  2. javascript 代替jqueryeach写法

    javascript 代替jqueryeach写法 // 通过字面量方式实现的函数each var each = function(object, callback){ var type = (fun ...

  3. Java入门系列之类继承、抽象类、接口(五)

    前言 C#和Java关于类.抽象类.接口使用方式基本相似,只是对应关键字使用不同罢了,本节呢,我们只是对照C#和Java中关于这三个概念在具体使用时,看看有哪些不一样的地方. 类继承 C#和Java在 ...

  4. TypeScript `this` 入参

    考察下面的示例代码: class MyClass { constructor(protected foo: string) {} @MyDecorator bar() { console.log(&q ...

  5. ASP.NET MVC教程二:ASP.NET MVC应用程序结构详解

    在上一篇文章中,讲解了一些MVC的概念,并且创建了第一个ASP.NET MVC项目,这篇文章将讲解ASP.NET MVC程序中的代码解构,新创建的MVC应用程序解构如下图所示: 一.App_Data ...

  6. ASP.NET MVC IOC依赖注入之Autofac系列(二)- WebForm当中应用

    上一章主要介绍了Autofac在MVC当中的具体应用,本章将继续简单的介绍下Autofac在普通的WebForm当中的使用. PS:目前本人还不知道WebForm页面的构造函数要如何注入,以下在Web ...

  7. Selenium(十五):unittest单元测试框架(一) 初识unittest

    1. 认识unittest 什么是单元测试?单元测试负责对最小的软件设计单元(模块)进行验证,它使用软件设计文档中对模块的描述作为指南,对重要的程序分支进行测试以发现模块中的错误.在python语言下 ...

  8. Thymeleaf对象的使用:数字对象

    Thymeleaf主要使用 org.thymeleaf.expression.Numbers 类处理数字,在模板中使用 #numbers 对象来处理数字. 开发环境:IntelliJ IDEA 201 ...

  9. python列表转换为字符串

    对于非纯字符串组成的列表,需要使用map(str, 列表)转换,纯字符串组成的列表则不需要转换 list1 = [1, 2, 3, 4, 5]c = ','.join(map(str,list1))p ...

  10. 微信小程序中换行,空格(多个空格)写法

    在小程序中HTML的网页实体无法正常使用,小程序中的写法为: 一.空格,换行 <text>你好!\t七月流火啊!\n我在下一行</text> \t 空格( 多个只会显示一个空格 ...