剖析分布式查询及相关性算分

分布式搜索的运行机制

ElasticSearch的搜索,会分两阶段进行

  • 第一阶段---Query

  • 第二阶段---Fetch

Query --then --Fetch

  • Query阶段

    • 用户发出搜索请求到ES节点.节点收到请求后,会以Coordinating节点的身份,在6个主副分片中随机选择3个分片.发出查询请求

    • 被选中的分片执行查询,进行排序.然后每个分片都会返回 From + Size 个排序后的文档ID和排序值给 Coordinating节点

  • Fetch阶段

    • Coordinating Node会将Query阶段,从每个分片获取的排序后的文档Id列表,重新进行排序,选取From到From + Size个文档的Id

    • 以 multi get请求的方式,到相应的分片获取详细的文档数据

Query Then Fetch 潜在的问题

  • 性能问题

    • 每个分片上需要查的文档个数 = From + Size

    • 最终协调节点需要处理:mumber_of_shard * (from + size)

    • 深度分页

  • 相关性算分

    • 每个分片都是基于自己的分片上的数据进行相关度计算.这会导致打分偏离的情况,特别是数据量很少时.相关性算分在分片之间是相互独立.当文档总数很少的情况下,如果主分片大于1,主分片越多,相关性算分会越不准

解决算分不准的方法

  • 数据量不大的时候,可以将主分片数设为1

    • 当数据量足够大的时候,只要保证文档均匀分散在各个分片上,结果一般不会出现偏差

  • 使用DFS Query Then Fetch

    • 搜索的URL中设定参数"_search?search_type=dfs_query_then_fetch"

    • 每个分片把各分片的词频和文档频率进行搜集,然后完整的进行一次相关性算分,耗费更加多的CPU和内存,执行性能低下,一般不建议使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值