分布式搜索的过程:
1.分别向5个分片发起请求
2.将5个分片的符合要求的结果全部返回,重新进行排序返回给用户
这种方式将会产生两个问题:
1.数量问题:假设用户要求返回10条数据,则5个分片会返回50条数据
2.排名问题:每个分片的分值都是基于本分片计算的,而ES排序是根据每个分片返回的分值进行排序的,这就导致了排序不准确
ES因此设置了四种查询方式:
query and fetch
向索引的所有分片发起请求,返回时将文档及排名信息一起返回
优点: 查询速度最快
缺点: 返回的数据量时是要求的n倍,排名不准确
query then fetch(默认)
1.向所有分片发起请求,只返回排序及排名相关的信息,整体进行重新排序,取前n个文档
2.去相关的shard取document
优点: 返回的数据量准确
缺点: 性能一般,排名不准确
DES query and fetch
比第一种方式多了DES操作. 即在查询之前,向所有分片发送请求,返回所有分片中的词频和文档频率并进行汇总,再执行进一步操作.
优点: 排名准确
缺点: 返回的数据量不准确,性能一般
DES query then fetch
比第二种方式多了DES操作
优点: 排名准确,返回的数据量准确
缺点: 性能一般
网友评论