用户在使用搜索功能时,最关心的就是搜索引擎能否根据搜索关键字,找出最匹配的搜索结果;

而搜索引擎可以根据调整搜索的相关性,来控制返回不同的搜索结果;

搜索结果的相关性,例如:

  • 是否可以找到所有相关的内容;
  • 有多少不想管的内容被返回了;
  • 文档的打分是否合理;
  • 结合业务需求,平衡结果排名;
    • Web 搜索,不仅仅要考虑内容的相关性,更重要的是内容的可靠度,综合相关性更高的展示在前面;
    • 电商搜索,不仅仅为用户提供搜索服务,搜索还扮演了销售的角色,向客户推荐新商品,去库存等;

1. 相关度指标

  • Precision 查准率
    • 尽可能返回较少的无关文档;
  • Recall 查全率
    • 尽量返回较多的相关文档;
  • Ranking 排名
    • 是否能够按照相关度进行排序?

2. 相关度算分

  • 搜索的相关性算分,描述了一个文档与查询语句匹配的程度。ES 会对每个匹配查询条件的结果进行算分 _score;
  • 打分的本质就是排序,需要把最符合用户需求的文档排在前面。ES 5 之前,默认的相关性算分采用 TF-IDF,ES 6.0 起采用 BM 25;

image.png

2.1 词频 TF

  • Term Frequency:检索词在一篇文档中出现的频率

    • 词频 = 检索词出现的次数 / 文档的总字数;
  • 度量一条查询和结果文档相关性的简单方法:简单将搜索中的每一个词的 TF 进行相加

    • TF(区块链) + TF(的) + TF(应用);
  • Stop Word

    • “的”在文档中出现了很多次,但是对贡献相关度几乎没有用处,不应该考虑它们的 TF;
    • 为了减少它在相关度上的算分比重,引入了 IDF,改为加权求和,一个词在所属有的文档记录中出现的太频繁,就会减轻它的重要程度;

      2.2 逆文档频率 IDF

  • DF,Document Frequency:检索词在所有文档中出现的频率;

    • “区块链”在相对比较少的文档中出现
    • “应用”在相对比较多的文档中出现
    • “Stop Word”在大量的文档中出现
  • IDF,Inverse Document Frequency:简单说 = log( 全部文档 / 检索词出现过的文档总数 );

  • TF-IDF 本质就是将 TF 求和变成了加权求和

    • TF(区块链)IDF(区块链) + TF(的)IDF(的) + TF(应用)*IDF(应用);

image.png

2.3 Lucene 中的 TF-IDF 评分公式

现代搜索引擎,对 TF-IDF 进行了大量细微的优化。ES 5 之前的版本就是采用的 TF-IDF。
image.png

2.4 BM 25 评分算法

image.pngimage.png

  • 从 ES 6.0 起,默认算法改为了 BM 25;
  • 和经典的 TF-IDF 相比,当 TF 无限增加时,BM 25 算分会趋于一个数值;

  • 在 Elasticsearch 中定制相关度算法的参数,定制 Similarity:

    • K 默认值是 1.2,数值越小饱和度越高,b 默认值是 0.75(取值范围 0-1),0 代表禁止 Normalization;
      1. PUT /my_index
      2. {
      3. "settings": {
      4. "similarity": {
      5. "custom_similarity": {
      6. "type": "BM25",
      7. "b": 0,
      8. "k1": 2
      9. }
      10. }
      11. },
      12. "mappings": {
      13. "doc": {
      14. "properties": {
      15. "custom_text": {
      16. "type": "text",
      17. "similarity": "custom_similarity"
      18. },
      19. "default_text": {
      20. "type": "text"
      21. }
      22. }
      23. }
      24. }
      25. }

      2.6 Boosting Relevance

  • Boosting 是控制相关度的一种手段

    • ES 中可以对索引,字段,或查询子条件,分别设置 Boosting 参数
  • 参数 boosting 的含义

    • 当 boost > 1 时,打分的相关度相对性提升;
    • 当 0 < boost <1 时,打分的权重相对性降低;
    • 当 boost < 0 时,贡献负分;
      1. POST testscore/_search
      2. {
      3. "query": {
      4. "boosting": {
      5. "positive": {
      6. "term": {
      7. "content": "elasticsearch"
      8. }
      9. },
      10. "negative": {
      11. "term": {
      12. "content": "like"
      13. }
      14. },
      15. "negative_boost": 0.2
      16. }
      17. }
      18. }