关于ElasticSearch搜索效果的问题分析
本文主要讨论两个问题:
- 如何聚合多个节点或分片的数据生成返回结果?
- ES是如何将相关度高的内容能放在前面的?
ES整体流程假设有N个分片 , 数据可能分散在这N个分片上 , ES搜索时 , 整体操作过程是:
- S1: 客户端将会同时向N个分片发起搜索请求 。
- S2: 这N个分片基于本分片的内容独立完成搜索 , 然后将符合条件的结果全部返回 。
- S3: 客户端将返回的结果进行重新排序和排名 , 最后返回给用户 。
- 数量问题 。 假设每次返回10条记录 , 那么这N个分片独立执行查询以后 , 每个分片最多都会返回10条数据给客户端 , 然后客户端在进行排序返回给用户 。 这个过程中返回的数据量(最大是10*N)会远大于用户请求需要的数据量 。
- 排名问题 。 计算分值使用的词频和文档频率等信息都是基于自己分片的数据进行的 , 不同分片中这些数据不同 , 直接导致各个分片算出来的分数不具有统一参考性 , 影响排名准确性 。 正确的做法是基于整体的词频、逆向文档频率等信息来算分数 。
- QUERY_AND_FEATCH**
- QUERY_THEN_FETCH
- DFS_QUERY_AND_FEATCH
- DFS_QUERY_THEN_FEATCH
相关搜索问题ES是如何将相关度高的内容能放在前面的?在原理篇我们知道 , 当将一个文档保存到ElasticSearch会根据分词的结果创建倒排索引 , 这种结构是零散的 , 即每一个Term都会对应Posting List 。 查询的时候也是先经过分词 , 然后根据倒排索引查询 。 这里就有一个问题 , ElasticSearch是如何将匹配度最高的内容放在前面的?如下图所示 , 匹配效果最好的内容放到了返回结果的最前面 。
文章插图
相关度Lucene 使用布尔模型(Boolean model)查找匹配文档 , 并使用权重来实现相关度搜索
- 布尔模型
- 就是在查询中使用 AND、OR、NOT(即与或非)来匹配文档
推荐阅读
- 高下立现!关于核心技术的态度,柳传志和任正非截然不同
- Apple Fitness+播放列表现可在Apple Music搜索上找到
- 关于手机的谣言……别再信了
- 这次真不站华为!关于华为下架腾讯游戏事件!华为有点不够意思
- 关于特斯拉副总裁陶琳女士回应的回应
- 关于小米11“环保”,是我们低估了雷军,还是小米高估了人性?
- 小米11正式发布,关于送不送充电器,雷军给出了一个“神奇”的方案
- 关于销售破万的华为新机!原来罗永浩曾经的话,还真的没有说错
- 苹果正在研发的搜索引擎能干的过谷歌吗?
- 关于5G手机的5个伪真相,别再继续被人骗下去了