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. react后台项目开发(一)

    1. 项目开发准备 描述项目 技术选型 api 接口(4部分:3请求{url,请求方式,请求参数格式}, 1响应数据格式)/ 接口文档/ 测试接口 2. 启动项目开发 使用react脚手架创建项目 开 ...

  2. 2019阿里天猫团队Java高级工程师面试题之第一面

    2019阿里天猫团队Java高级工程师面试题之第二面 2019阿里天猫团队Java高级工程师面试题之第三面 1.五分钟自我介绍,说说自己的擅长及拿手的技术 自我介绍是为了考察面试者的语言表达和总结概括 ...

  3. 集合系列 Set(八):TreeSet

    TreeSet 是 Set 集合的红黑树实现,但其内部并没有具体的逻辑,而是直接使用 TreeMap 对象实现.我们先来看看 TreeSet 的定义. public class TreeSet< ...

  4. Logstash Multiple Pipelines

    作为生产者和消费者之间数据流的一个中心组件,需要一个 Logstash 实例负责驱动多个并行事件流的情况.默认情况下,这样的使用场景的配置让人并不太开心,使用者会遭遇所谓的条件地狱(Condition ...

  5. Java,该学什么?

    本人大学学的是生物技术专业,毕业后入坑Java. 最近有人问我是如何转行的,需要学一些什么.我在网上看到一篇帖子,觉得写得很全.如果是我来写,可能还写不了这么全的.在此分享给网友. 2019秋招几个月 ...

  6. 如何使redis中存放的都是热点数据?

    当redis使用的内存超过设置的最大内存时,会触发redis的key淘汰机制,在redis3.0中的6中淘汰策略如下: (1)noeviction :不删除策略.当达到最大内存限制时,如果需要使用更多 ...

  7. linux命令-挂载命令

    一.挂载命令 1.mount 命令基本格式 linux 所有存储设备都必须挂载使用,包括硬盘 命令名称:mount 命令所在路径:/bin/mount 执行权限:所有用户 [root@localhos ...

  8. React躬行记(1)——函数式编程

    函数式编程是React的精髓,在正式讲解React之前,有必要先了解一下函数式编程,有助于更好的理解React的特点.函数式编程(Functional Programming)不是一种新的框架或工具, ...

  9. ASP.NET Core - 基于IHttpContextAccessor实现系统级别身份标识

    问题引入: 通过[ASP.NET Core[源码分析篇] - 认证]这篇文章中,我们知道当请求通过认证模块时,会给当前的HttpContext赋予当前用户身份标识,我们在需要授权的控制器中打上[Aut ...

  10. 清新淡雅教育教学工作课件PPT模板

    模板来源:http://ppt.dede58.com/jiaoxuekejian/26240.html