zoukankan      html  css  js  c++  java
  • elasticsearch关于explain参数解释:docFreq docCount

    背景介绍

    排查问题时需要分析问题成因,设置explain为true,打开分数打印后,公式虽然大差不离的看得懂,但是却忘了几个参数什么意思,在这里记录一下。

    样例分析

    首先任意选取一次explain的结果


     
     

    图中很明显是在做tf和idf的计算,几个比较迷惑人的地方

    1. 542是什么意思
    weight(topic_name:周杰伦 in 542) [PerFieldSimilarity], result of:
    

    这里面的542一开始我误以为是docCount,后来发现不是…542是lucene文档内部的id,和外部的_id不同,不参与计算,无需理会。

    1. docFreq是什么
      docFreq是指符合搜索条件的doc数目有多少,图中为5,我们可以理解为,符合topic_name:周杰伦这个召回条件的docCount在这个分片下有5篇。注意!!!是在这条数据对应的分片下!!!
    2. docCount是什么
      docCount是指数据对应的分片下的文档总数,日常召回时会发现不同文档的docCount不一样,而理论上应该是一样的。原因就是来自于集群的不同分片。同理,如果你专门去找2条来自于同一分片的数据验证对比,可以发现docCount是相同的。
    3. termFreq是什么
      搜索词在该字段中出现的次数。这里注意不是简单理解上的搜索次数,需要看字段的类型,如果是不分词字段,则必须要完全匹配才会有一次。
      关于分片的原理参考Elasticsearch参数search_type与分布式原理
      这篇博客的这一段说法,说得很好,很容易理解

    从定义可知,idf仅仅与搜索关键词有关,与文档无关。所以同一输入来说,所有的文档应该是共享同一idf的。但事实上并非如此。原因就在elasticsearch的分布式机制。elasticsearch的索引(index)会被分片(shard),而每一个分片相当于一个独立的搜索引擎。每一次搜索任务会被分配到不同的shard去执行,然后将各个shard的结果汇总起来得到最终我们看到的结果。而评分的过程会在shard完成,因此不同分片下,会得到不同的idf。这里需要有个前提假设是文档数量足够多的时候各个分片的词频会趋近,因此idf的差异也就不大。但是如果文档数量不够多的时候启用分片,可能词频在不同分片会有较大的差异,我遇到的情况就是这样的

    结论

    在排查相关性分数相关问题时首先打开explain查看具体计算方式,而这些计算分数的因子可能受分片数量影响,需要注意



    作者:十五倍压枪
    链接:https://www.jianshu.com/p/ffecea5c7360
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    mysql show的常见用法
    【转】在ubuntu下完美安装RTX(解决离线、乱码问题)(图片无法显示)
    bcdedit 替代easybcd 编辑grub
    Ruby学习札记(二)[数组]
    Ruby学习札记(一)常用数据
    [分布式]分布式锁
    移动docker数据文件到nas共享盘、释放C盘空间
    [分布式]分布式限流
    [分布式]分布式会话session、spring-session
    学习强国挑战答题学习资料
  • 原文地址:https://www.cnblogs.com/a-du/p/13476509.html
Copyright © 2011-2022 走看看