Elasticsearch 6.x版本全文检索学习之Search的运行机制

  • 2019 年 11 月 12 日
  • 笔记

1、Elasticsearch之深入了解Search的运行机制。

  答:Search的运行机制,Search执行的时候实际分两个步骤运作的,分别是Query阶段、Fetch阶段。称为Query-Then-Fetch。

2、Search的运行机制,相关性算分问题。

  答:a、相关性算分在shard与shard间是相互独立的,也就意味着同一个Term的IDF等值在不同shard上是不同的。文档的相关性算分和它所处的shard相关。     b、在文档数量不多的时候,会导致相关性算分严重不准的情况发生。

3、解决相关性算分问题的思路有两个。

  答:a、第一个是设置分片数为1个,从根本上排除问题,在文档数量不多的时候可以考虑该方案,比如百万到千万级别的文档数量。     b、第二个是使用DFS Query-then-Fetch查询方式。DFS Query-then-Fetch是在拿到所有文档后再重新完整的计算一次相关性算分,耗费更多的cpu和内存,执行性能也比较低下,一般不建议使用。

4、Elasticsearch之排序。

  答:es默认会采用相关性算分排序,用户可以通过设定sorting参数来自行设定排序规则。注意,按照字符串排序比较特殊,因为es有text(text会进行分词)和keyword两种类型,针对text类型排序。username.keyword是keyword类型的。如果text类型的字段进行排序会报错,但是使用text类型的字段后面.keyword是可以返回预期结果的。

Fielddata和DocValues的对比。 如下所示:

Fielddata默认是关闭的,可以通过api开启,此时字符串是按照分词后的term排序,往往结果很难符合预期。一般是在对分词做聚合分词的时候开启。Fielddata只对text类型有效果的。

Doc Values默认是启用的,可以在创建索引的时候关闭,如果后面要再开启doc values,需要做reindex操作。什么时候直到不用doc values,明确知道不需要按照这个字段进行排序,不需要按照这个字段做聚合分析,将这个字段doc values关闭,关闭以后加快索引速度,减少磁盘空间占用。

docvalue_fields,可以通过该字段获取fielddata或者doc values中存储的内容。

5、分页与遍历,es提供了3种方式来解决分页与遍历的问题。from/size、scroll、search_after。

  a、from/size,from指明开始位置,size指明要获取的总数。total_page=(total + total_size -1)/page_size。total_page总页数,total文档总数。深度分页问题,解决方法,使用index.max_result_window限定最多到10000条数据。适用场景,需要实时获取顶部的部分文档,且需要自由翻页。

  b、Scroll,遍历文档集的api,以快照的方式来避免深度分页的问题。注意点,不能用来做实时搜索,因为数据不是实时的、尽量不要使用复杂的sort条件,使用_doc最高效、使用稍嫌弃复杂。适用场景,需要全部文档,如导出所有数据的功能。

c、Search_after,避免深度分页的性能问题,提供实时的下一页文档获取功能。注意点如下,缺点是不能使用from参数,即不能指定页数、只能下一页,不能上一页、使用简单。适用场景,需要全部文档,不需要自由翻页。

再牛逼的案例,理论,都没有官网的牛逼,下面贴一下,如何去官网学习。

找到这里,自己可以巴拉巴拉,看自己需要的版本,对应的知识点。

Elasticsearch Query DSL的语法。各种查询语法可以多看看,增加词汇量,学会熟练使用。

作者:别先生 博客园:https://www.cnblogs.com/biehongli/