引言

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

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

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

注意: 本文基于 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 或者文章中搜寻出特定的内容。

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

  • 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

Elasticsearch Query DSL 整理总结(一)—— Query DSL 概要,MatchAllQuery,全文查询简述的更多相关文章

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

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

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

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

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

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

  4. elasticsearch入门使用(三) Query DSL

    Elasticsearch Reference [6.2] » Query DSL 参考官方文档 :https://www.elastic.co/guide/en/elasticsearch/refe ...

  5. Elasticsearch由浅入深(九)搜索引擎:query DSL、filter与query、query搜索实战

    search api的基本语法 语法概要: GET /_search {} GET /index1,index2/type1,type2/_search {} GET /_search { , } h ...

  6. Elasticsearch NEST – Examples for mapping between Query and C#

    Elasticsearch NEST – Examples for mapping between Query and C# During my training with Elasticsearch ...

  7. Obtaining Query Count Without executing a Query in Oracle D2k

    Obtaining Query Count Without executing a Query in Oracle D2k Obtaining a count of records that will ...

  8. Oracle Flashback Transaction Query with Oracle Flashback Version Query

    Oracle Flashback Transaction Query with Oracle Flashback Version Query In this example, a database a ...

  9. 白日梦的Elasticsearch实战笔记,ES账号免费借用、32个查询案例、15个聚合案例、7个查询优化技巧。

    目录 一.导读 二.福利:账号借用 三._search api 搜索api 3.1.什么是query string search? 3.2.什么是query dsl? 3.3.干货!32个查询案例! ...

随机推荐

  1. aop 拦截含有特定注解的类

    1.功能点:使用aop拦截含有自定义注解的类 1.自定义注解 package com.zhuanche.common.dingdingsync; import java.lang.annotation ...

  2. LeetCode 题解之Add Digits

    1.问题描述 2.问题分析 循环拆分数字,然求和判断. 3.代码 int addDigits(int num) { ) return num; int result = num; do{ vector ...

  3. MySQL优化之Explain命令解读,optimizer_trace

    简述: explain为mysql提供语句的执行计划信息.可以应用在select.delete.insert.update和place语句上.explain的执行计划,只是作为语句执行过程的一个参考, ...

  4. 减少MySQL的Sleep进程有效方法

    经常遇到很多朋友问到,他的MySQL中有很多Sleep进程,严重占用MySQL的资源,现在分析一下出现这种现象的原因和解决办法: 1,通常来说,MySQL出现大量Sleep进程是因为采用的PHP的My ...

  5. ssh中文手册

    ssh-keygen 中文手册 sshd_config 中文手册 sshd 中文手册

  6. 【转】Nginx学习---负载均衡的原理、分类、实现架构,以及使用场景

    [原文]https://www.toutiao.com/i6593604356799463944/ [原文]https://www.toutiao.com/i6592741060194075143/ ...

  7. 安全之路 —— C/C++开3389端口(远程终端)

    简介 在渗透测试中开启对方电脑的3389端口是入侵者加入对方计算机账户后要想直接控制对方计算机的必须步骤,即开启对方计算机的远程终端功能,不同的Windows系统要开启3389需要修改不同的注册表项, ...

  8. October 20th 2017 Week 42nd Friday

    My life is in these books. Read these and know my heart. 我的人生就在这些书中,读完他们就能读懂我的心. Some people say tha ...

  9. 3.Dubbo2.5.3快速启动Hello World

    转载请出自出处:http://www.cnblogs.com/hd3013779515/ 1.服务提供者 (1)工程目录 (2)接口代码 HelloService.java package cn.lj ...

  10. Python datetime.md

    datetime datetime模块包含了一些用于时间解析.格式化.计算的函数. Times 时间值由time类来表示, Times有小时, 分, 秒和微秒属性. 以及包含时区信息. 初始化time ...