首页 > 其他分享 >Elastic学习之旅 (6) Query DSL

Elastic学习之旅 (6) Query DSL

时间:2024-04-04 22:12:31浏览次数:20  
标签:search Elastic GET 查询 DSL query Query match

大家好,我是Edison。首先说声抱歉,这个ES学习系列很久没更新了,现在继续吧。

上一篇:ES的倒排索引和Analyzer

什么是Query DSL

DSL是Domain Specific Language的缩写,指的是为特定问题领域设计的计算机语言。这种语言专注于某特定领域的问题解决,因而比通用编程语言更有效率。

在ElasticSearch中,DSL指的是Elasticsearch Query DSL,是一种以JSON形式表示的查询语言。通过这种语言,用户可以构建复杂的查询、排序和过滤数据等操作。这些查询可以是全文搜索、聚合搜索,也可以是结构化的搜索。

Elastic Query DSL的基本语法如下:

# 基本格式
GET /es_db/_doc/_search {json-request-body}
# 简化格式
GET /es_db/_search {json-request-body}

match_all

使用match_all就类似于SQL中的SELECT *了,它会匹配所有文档,但默认只会返回10条数据。这是因为,_search查询默认采用的是分页查询,每页size默认值就是10,因此如果想显示更多,请制定size。

// 匹配所有文档,默认分页只返回10条
GET users/_search
{
  "query":
  {
    "match_all":{}
  }
}
// 设置分页的每页条数size值为20
GET users/_search
{
  "query":
  {
    "match_all":{}
  },
  "size": 20
}

分页查询 from & size & sort

分页查询最重要的3个参数:from 、size 和 sort。

from: 显示应该跳过的初始结果数量,默认是0。

size: 显示应该返回的结果数量,默认是10,刚刚有演示。

sort: 根据什么字段 以及 升序 或 降序 来排序。

// 从第5个文档开始取10个显示,并根据用户名升序排列
GET users/_search
{
  "query":
  {
    "match_all":{}
  },
  "sort": 
  {
    "user": "asc"
  }
  "from": 5
  "size": 20
}

_source 过滤

_source参数就好比SELECT field1, field2,当我们需要只查询某些特定字段时,就可以使用_source参数来进行过滤。_source支持使用通配符,可以较为方便的编写,如:_source["name*","desc*"]。

# 只查询users中的user和message两个字段数据,过滤掉其他字段
GET users/_search
{
  "_source": ["user","message"], 
  "query":
  {
    "match_all":{}
  },
  "from": 0,
  "size": 20
}

match 查询表达式

match 查询表达式可能是我们用的最多的参数了,它会在匹配时对所查找的关键词进行分词,然后按照分词匹配查找。

match 支持以下参数:

  • query 指定匹配的值

  • operator 匹配条件类型

  • and 条件分词后都要匹配

  • or 条件分词后有一个匹配即可(默认的operator类型

// 默认为or => comments字段中有文档出现任意一个Song or Last or Christmas
GET comments/_search
{
  "query":
  {
    "match":
    {
      "comment": 
      {
        "query": "Song Last Christmas"
      }
    }
  }
}

// 手动指定and => comments字段中有文档同时出现Song Last Christmas
GET comments/_search
{
  "query":
  {
    "match":
    {
      "comment": 
      {
        "query": "Song Last Christmas",
        "operator": "and"
      }
    }
  }
}

multi_match 多字段查询表达式

上面演示的是针对单个字段的查询,那么如果想要针对多个字段查询呢?

使用multi_match即可,指定fields:

GET comments/_search
{
  "query":
  {
    "multi_match":
    {
      "query": "Song Last Christmas",
      "fields": ["comments", "address"]
    }
  }
}

match_phrase 短语查询表达式

短语查询会对搜索文本进行文本分析,然后才到索引中寻找搜索的每个分词并要求分词相邻。我们可以通过slop参数设置分词出现的最大间隔距离,可以通过下面的例子来看看。

// 查询one love这个短语出现过的文档
POST movies/_search
{
  "query":
  {
    "match_phrase": {
      "title": {
        "query": "one love"
      }
    }
  }
}
// 只要one和love之间间隔不超过1个词就都显示出来
POST movies/_search
{
  "query":
  {
    "match_phrase": {
      "title": {
        "query": "one love",
        "slop": 1
      }
    }
  }
}

搜索结果:One I Love

query_string 与 simple_query_string

Query String类似于URI Query,这种查询方式的语法和我们在SQL中的WHERE语句就有些类似了,基于OR/AND/NOT等运算符来解析和拆分提供的查询字符串,我们可以使用 Query String 查询创建一个较为复杂的搜索,其中可以包括通配符、跨多个字段的搜索等。

虽然用途广泛,但是语法较为严格,容易出错,不推荐在日常查询中使用。

// 查询单个字段
GET /bank/_search
{
  "query": {
    "query_string": {
      "default_field": "address",
      "query": "Chengdu AND Shuangliu"
    }
  }
}

// 查询多个字段
GET /bank/_search
{
  "query": {
    "query_string": {
      "fields": ["name", "address"],
      "query": "(Edison AND Zhou) OR (Chengdu AND Shuangliu)"
    }
  }
}

Simple Query String 顾名思义 就是简单版Query String,它类似于Query String但会忽略错误的语法。此外,它不支持AND OR NOT,会将它们当作字符串来处理。各个Term之间默认的关系是OR,但可以指定Operator来覆盖。

// 默认operator是OR => 出现其一即可 Edison or Zhou
GET /bank/_search
{
  "query": {
    "simple_query_string": {
      "query": "Edison Zhou",
      "fields": ["name"]
    }
  }
}
// 覆盖默认operator 改为AND => 必须完整出现 Edison Zhou
GET /bank/_search
{
  "query": {
    "simple_query_string": {
      "query": "Edison Zhou",
      "fields": ["name"],
      "default_operator": "AND"
    }
  }
}

小结

本篇,我们了解了ElasticSearch的Query DSL,并通过一些查询示例了解了如何使用它。除了本文中介绍的部分高频DSL外,你可以通过搜索阅读其他的关键词进行学习。

参考资料

极客时间,阮一鸣,《ElasticSearch核心技术与实战

 

作者:周旭龙

出处:https://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

标签:search,Elastic,GET,查询,DSL,query,Query,match
From: https://www.cnblogs.com/edisonchou/p/-/edc_elastic_study_notes_chap06

相关文章

  • Excel、PowerQuery 和 ChatGPT 终极手册(上)
    原文:UltimateChatGPTHandbookforEnterprises译者:飞龙协议:CCBY-NC-SA4.0序言在不断发展的数据管理和分析领域中,掌握Excel的查找功能不仅是一种技能,更是高效数据处理的基石。《使用PowerQuery和ChatGPT的终极Excel》不仅仅是一本书;它是为数据爱好者、Excel爱好......
  • Elasticsearch与Clickhouse的对比分析
    ClickHouse和Elasticsearch是两种不同的数据存储和分析工具,各自在不同的用例和场景下发挥着作用。数据类型:ClickHouse:主要用于结构化数据,特别擅长处理大规模的数据仓库和分析场景,支持SQL查询。Elasticsearch:适用于非结构化或半结构化数据,特别擅长全文搜索和日志分析,支......
  • jquery的blockUI遮罩层的使用(1),bootstrap前端开发
    //pluginmethodforblockingelementcontent$.fn.block=function(opts){if(this[0]===window){$.blockUI(opts);returnthis;}varfullOpts=$.extend({},$.blockUI.defaults,opts||{});this.each(function(){var$el=$(this);if(fullOpts......
  • JQuery
    目录简介JQuery对象JQuery的使用Dom对象与JQuery包装集对象JQuery选择器基础选择器层次选择器表单选择器JQueryDom操作操作元素属性操作元素样式操作元素的内容创建元素添加元素删除元素遍历元素JQuery事件ready预加载事件绑定事件JQueryAjax$.ajax$.get$.post$.getJSON简介......
  • 界面控件Kendo UI for jQuery 2024 Q1亮点 - 新的ToggleButton组件
    Telerik & KendoUI 2024Q1版本于2024年初发布,在此版本中将AI集成到了UI组件中,在整个产品组合中引入AIPrompt组件以及10多个新的UI控件、支持Angular17、多个数据可视化功能增强等。P.S:KendoUIforjQuery提供了在短时间内构建现代Web应用程序所需的一切,从众多UI子控件中......
  • 界面控件Kendo UI for jQuery 2024 Q1亮点 - 新的ToggleButton组件
    Telerik & KendoUI 2024Q1版本于2024年初发布,在此版本中将AI集成到了UI组件中,在整个产品组合中引入AIPrompt组件以及10多个新的UI控件、支持Angular17、多个数据可视化功能增强等。P.S:KendoUIforjQuery提供了在短时间内构建现代Web应用程序所需的一切,从众多UI子控......
  • Spring Data Elasticsearch String类型不指定filed 索引创建情况
    对于String类型的字段如果不指定类型会默认创建两种倒排索引       "itemSkuCodes":{         "type":"text",         "fields":{           "keyword":{             "type":"keyword",           ......
  • windows环境下elasticsearch安装教程(超详细)
     一、安装jdkElasticSearch是基于lucence开发的,也就是运行需要javajdk支持。所以要先安装JAVA环境。由于ElasticSearch5.x往后依赖于JDK1.8的,所以现在我们下载JDK1.8或者更高版本。下载JDK1.8,下载完成后安装。二、安装ElasticSearch1.ElasticSearch下载地址:https:/......
  • Elasticsearch各个版本重要特性
    Elasticsearch各个版本重要特性Elasticsearch5Elasticsearch6.0Elasticsearch7.0Elasticsearch8.0Elasticsearch5首先说明下,ES是从版本2直接跳到5的,主要是为了和ElasticStack其他组件保持版本一致ES5,在现在来说是比较老的版本了,就不多介绍了建议大家使用ES7,或者直接使用ES8E......
  • ElasticSearch 实战:ElasticSearch文档多条件查询
    Elasticsearch实战:Elasticsearch文档多条件查询在实际应用中,常常需要根据多个条件对文档进行筛选。Elasticsearch提供了多种查询类型和查询组合机制,支持构建复杂的多条件查询。以下是如何进行文档多条件查询的详细步骤:**1.**布尔查询(BoolQuery)布尔查询是构建多条件......