当前位置:首页 > 问答库 > Java基础知识 > 详情

实战应用|在ElasticSearch中有哪些”大坑“需要避免

来源:千锋教育

发布:syq

2022-10-27

Java基础知识 分类问答库

推荐答案

  一. 背景

  对于elasticsearch,想必大家应该都不陌生,它广泛应用于站内搜索,海量数据的处理等业务场景中。本文主要是给大家聊聊,在使用ElasticSearch进行业务开发时,曾经遇到过的意想不到的一个”大坑“。

在ElasticSearch

  二. bug复现

  我们知道,elasticsearch以查询高效著称,主要应用于查询。所以在es中,提供了丰富的查询接口,其中包含了复合查询、过滤查询、分桶聚合、boosting查询、match查询、range查询等各种查询接口。而在这些查询接口中,复合查询与过滤查询是我们比较常用的,也是我们需要特别注意的,因为该接口稍一不注意,就会让你万劫不复,下场很悲惨哦!!!

  先来说下这种查询,当我们需要进行多条件查询时其实就可以使用复合查询,如下:

1

  当然我们也可以使用过滤查询,如下:

2

  以上两种查询的结果其实都是一样的,但他们还是有区别的!它们的主要区别在于,复合查询会影响到文档的分数,但过滤查询不会,不信你可以测试一下哦。不过,这不是要给大家讲的重点!重点在于我们在使用过滤查询时,会出现主条件查不出文档内容,但过滤却能过滤出文档列表。

  为了能让大家搞清楚这个区别,给大家展现了如下一个需求:

3

  上图是一个典型的站内搜索需求,具体接口实现如下:

4

  那么问题来了:

  当用户在输入框中先输入”可口可乐“,然后点击查询按钮,结果由于索引库中没有”可口可乐“,用户没有查到他想要的内容。接着用户点击了过滤面板中的良品铺子,结果却又能过滤出”可口可乐“这个数据出来,这就不合情理了吧!用户的主条件没有查询到内容,过滤时却又能出现相关的内容?任何一个较真的程序员,应该都不会允许这样的情况发生,这就是bug呀!

  三. 问题解决

  这个问题曾经也困惑过我,当时询问过其他人,也查阅过一些资料,最后才发现问题的原因所在。其实要想解决这个问题,我们只需要添加一个查询参数即可,如下:

5

  这个参数的意思是,should复合查询条件中必须满足一个条件,才会过滤。也就是说,如果should中一个条件都没有满足,那么就不会过滤。

  四. 结语

  今天的这篇文章,不知道给了各位什么样的启发?有时候一个小小的参数,如果你很熟悉,可能啥问题都不会发生,但如果你不知道,这个小小的参数,却可能会让你在”大坑“里爬很久都出不来。所以,希望各位在学习的时候,一定要认真对待每一个API,有时候不经意的一个小方法,都足以解决你的大问题。当然,在你学习的路上,一个好的”老师“,也是非常重要的,好的老师知无不言言无不尽,会详细地把各种情况都尽可能地给大家分析预测到,这样才会避免各位少走弯路,避免浪费时间。

更多问题在线答疑

导师线上坐镇
解答个性化学习难题

立即提问

上一篇

Java基本类型之间是如何进行转换的?

下一篇

开发必懂|Spring-retry 框架的底层原理详解

相关问题

更多 >>
请求转发与重定向,傻傻分不清?看这篇文章试试 什么Maven?项目为什么选用maven进行构建? 处理大文件排序的方式--外部排序 HashMap和HashTable有什么区别? hashcode是什么?有什么作用? ArrayList和LinkedList的区别?分别用在什么场景
热门问题
Java基础知识 Java培训机构 Java培训费用 Java培训时间 java培训课程 Java培训就业 零基础学Java java薪资待遇 java学习路线

全国咨询热线400-811-9990