es进阶


es进阶


一、结构化搜索

1、term filter搜索数据

es版本5.2以后,type=text,默认会有两个field,一个是field本身,比如articleID,是支持分词的;还有一个就是field.keyword,它默认是不支持分词的,会最多保留256个字符

image-20210321183552898

term filter注意点:

  1. 对搜索文本不分词,直接拿去倒排索引中匹配,你输入的是什么,就去匹配什么;

  2. 因此在搜索type=text的字段时,使用feild本身是搜索不到内容的,因为已经对field本身这种字段进行了分词;而应该采用field.keyword这种字段进行搜索,它不会进行分词,因此能搜索到相应结果;

  3. 所以term filter,对text过滤,可以考虑使用内置的field.keyword来进行匹配,但默认只保留256个字符。所以尽可能自己去手动建立索引,指定not_analyzed,但在新版本的es中,可以不指定not_analyzed了,将type=word即可。

    image-20210321185555877
  4. image-20210321190356430

2、_filter执行原理

_filter执行原理深度剖析(bitset机制与caching机制)

bitset机制:

  1. 一个二进制数组;

  2. 使用找到的doc list,构建一个bitset二进制数组,数组的每个元素都是0或1,用来表示一个doc对一个filter条件是否匹配,如果匹配就是1,不匹配就是0;

    image-20210321192052047
  3. bitset机制好处是尽可能用简单的数据结构去实现复杂的功能,可以节省内存的空间,来提升性能;

  4. 对于过滤条件比较多的_search,每个条件都对应一个bitset。在查找满足所有条件的doc时,会遍历每个过滤条件对应的bitset,但会先遍历比较稀疏的bitset,就可以先过滤尽可能多的数据,提升性能

caching机制:

  1. 缓存过滤条件达到一定次数的bitset;
  2. 在最近的256个query中,超过了一定次数的过滤条件,缓存其bitset在内存中,这样下次如果再有这个条件过来的时候,就不用重新扫描倒排索引,反复生成bitset了,可以大幅度提升性能;
  3. 如果doc有新增或修改,那么cached bitset会自动更新,当有相同的filter条件时,会直接使用这个过滤条件对应的cached bitset;

filter和query的对比:

  1. filter大部分情况下,在query之前执行,先尽可能过滤掉尽可能多的数据;
  2. query会计算doc对搜索条件的relevance score,还会根据这个socre去排序,性能低;
  3. filter只是简单过滤出想要的数据,不会计算relevance score,也不会排序,性能高,过滤大部分数据;

3、bool组合多个filter条件

​ bool下面可以跟:must,must_not,should等过滤条件,分别表示:必须匹配、必须不匹配、应该匹配;可以对应到sql中的==、!=、or;或者说对应:满足所有条件的过滤、不满足所有条件的过滤、满足条件中的1个的过滤。

image-20210321195052919

bool还可以嵌套:

image-20210321195929906

4、terms使用

使用terms搜索多个值,以及多值搜索结果优化

image-20210321200235736
image-20210321201016810

上面的搜索包含java的对应的文档记录,现在优化只包含java的文档记录,添加一个字段tag_cnt记录tag包含的条数,则优化后的请求是这样的

image-20210321201606661

5、range filter范围过滤

range类似于sql中的算数运算符或者between

数值

image-20210321202218130

日期

image-20210321202401711

二、深度探秘搜索技术

1、手动控制全文检索精确度

全文检索match query。

如果检索的字段是not_analyzed类型(type=keyword),那么match query也相于term query

image-20210321204138409

通过and关键字实现搜索结果精确控制

image-20210321204348328

通过minimum_should_match指定文档记录中必须匹配多少个关键字才能结果返回

image-20210321204858425 image-20210321205358266 image-20210321205924243

2、term+bool底层原理

term+bool实现multiword搜索底层原理解析

image-20210321210711312 image-20210321211002821 image-20210321211203252

3、基于boost的细粒度搜索条件权重控制

boost的作用:

  1. 加大某个搜索条件的权重
  2. 权重越大的搜索条件所对应的relevance score就越高,就会优先返回作为结果
image-20210321212359495

4、多shard场景下relevance score不准确问题

当一个索引有多个分片的时候,搜索结果可能会不准确

image-20210321213229040

如何解决

image-20210321213650477

5、基于dis_max实现best fields策略进行多字段搜索

批量加入字段通过_bulk

image-20210321214408001

多字段搜索

image-20210321214725030

best fields策略

dis_max只会考虑把多条匹配语句中分数最高的拿来做比较

image-20210321215532426

6、基于tie_breaker参数优化dis_max搜索效果

image-20210321221220758

案例分析

image-20210321220336814

tie_breaker解决上方案例中dis_max的缺点(tie_breaker取值在0~1)

使用tie_breaker将其它query分数也考虑进去

image-20210321220854830

7、基于multi_match语法实现dis_max和tie_braker

image-20210321221649598

上面的查询请求写法直接通过multi_match(dis_max直接通过type指定为best_fields)

image-20210321222048147

8、基于multi_match+most fields策略进行multi_field搜索

best-fields对比most fields

  • 前者主要是说某一个field匹配尽可能多的关键字的doc优先返回回来
  • 后者主要是说尽可能返回更多field匹配到某个关键字的doc优先返回回来
image-20210321224923262

指定分词器

image-20210321225309774

multi_match进行搜索(type指定为most_fields即可)

image-20210321225934153

best-fields对比most fields

image-20210321230338509

9、使用most_fields策略进行cross-fields 搜索弊端解析

关于cross-fields

image-20210321231159135

定义文档

image-20210321231549960

执行搜索

image-20210321231756065

结果分析:

  1. 按道理doc5应该排第一,包含了 Peter Smith,但结果doc2排到了第一;
  2. image-20210321232704237

弊端分析

image-20210321233018161

10、使用copy_to定制组合field解决cross-fields搜索弊端

copy_to原理

image-20210321234056057

copy_to语法(将多个字段值拷贝到一个字段中,并建立倒排索引)

image-20210321234525202

添加doc

image-20210321234625343

执行查询请求

image-20210321234655555

结果分析

image-20210321235348433

11、使用原生cross-fields技术解决搜索弊端


文章作者: LJH
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 LJH !
  目录