欢迎光临散文网 会员登陆 & 注册

袁庭新老师ES系列12节|Elasticsearch高级查询

2023-09-20 11:44 作者:袁庭新  | 我要投稿

前言

上篇文章讲了关于Elasticsearch的基本查询操作。接下来袁老师为大家带来Elasticsearch高级查询部分相关的内容。Elasticsearch是基于JSON提供完整的查询DSL(Domain Specific Language:领域特定语言)来定义查询。因此,我们有必要在专题模块来详细探讨Elasticsearch高级查询部分内容。

我们先来做个热身,了解下这一小节学习的目标,我将带领大家从以下五个模块来学习Elasticsearch的高级查询相关技术。

  • 结果过滤查询

  • 条件过滤查询

  • 结果排序

  • 分页查询

  • 高亮显示

一. 结果过滤查询

默认情况下,Elasticsearch在搜索的结果中,会把文档中保存在_source的所有字段都返回。

如果我们只想获取其中的部分字段,我们可以添加_source属性来进行过滤。

1.直接指定字段

演示示例:

语法说明:在查询结构中,通过_source属性来指定查询结果集中需要保留哪些字段信息。

响应结果:

演示过程见下:

2.指定includes和excludes

我们也可以通过:

注意:二者都是可选的。

演示示例:

响应结果:

演示效果见下:

下面的示例与上面的结果将是一样的:

响应结果:

演示效果见下:

二. filter过滤

Elasticsearch使用的查询语言(DSL)拥有一套查询组件,这些组件可以以无限组合的方式进行搭配。这套组件可以在以下两种情况下使用:过滤情况(filtering context)和查询情况(query context)。

如何选择查询与过滤?通常的规则是,使用查询(query)语句来进行全文搜索或者其它任何需要影响相关性得分的搜索。除此以外的情况都使用过滤(filters)。

1.条件查询中进行过滤

所有的查询都会影响到文档的评分及排名。如果我们需要在查询结果中进行过滤,并且不希望过滤条件影响评分,那么就不要把过滤条件作为查询条件来用。而是使用filter方式:

响应结果:

演示效果见下:

2.无查询条件直接过滤

如果一次查询只有过滤,没有查询条件,不希望进行评分,我们可以使用constant_score取代只有filter语句的bool查询。在性能上是完全相同的,但对于提高查询简洁性和清晰度有很大帮助。

响应结果:

演示效果见下:

三. 结果排序

1.单字段排序

sort可以让我们按照不同的字段进行排序,并且通过order属性指定排序的方式。

演示案例:

响应结果:

2.多字段排序

假定我们想要结合使用price和_score(得分)进行查询,并且匹配的结果首先按照价格排序,然后再按照相关性得分降序排序:

响应结果:

四. 分页查询

Elasticsearch中数据都存储在分片中,当执行搜索时每个分片独立搜索后,数据再经过整合返回。那么,如果要实现分页查询该怎么办呢?

Elasticsearch的分页与MySQL数据库非常相似,都是指定两个值:

演示案例:

响应结果:

五. 高亮显示

1.高亮显示原理

高亮显示的原理介绍见下:

  • 服务端搜索数据,得到搜索结果。

  • 把搜索结果中,搜索关键字都加上约定好的标签。

  • 前端页面提前写好标签的CSS样式,即可高亮显示。

Elasticsearch中实现高亮的语法比较简单,高亮显示语法格式见下:

在使用match查询的同时,加上一个highlight属性。highlight属性提供以下属性:

演示案例:

响应结果:

 演示过程见下:

六. 结语

关于Elasticsearch高级查询篇相关的内容我们就给大家介绍完了,来复习回顾下这一章节的主要内容。本文从结果过滤查询、结果排序、分页查询、检索查询、关键字查询、高亮显示、过滤查询等几个方面通过实例讲解了Elasticsearch的高级查询。如果还没有掌握的小伙伴,一定要通过文章中大量的案例来进行实操演练从而巩固这一部分知识。下一小节我们将为大家带来Elasticsearch中聚合操作相关的内容。

袁庭新老师ES系列12节|Elasticsearch高级查询的评论 (共 条)

分享到微博请遵守国家法律