同福

Elasticsearch通过加权对不同字段设置不同的权重比【20201020】

介绍

介绍

福哥在使用Elasticsearch建立搜索引擎的时候,文档有多个字段标题(title)、关键字(keyword)、正文(content),现在是全部字段都是一样权重这样查询出来的结果排序很不理想

那么应该怎么办呢?

福哥学到了可以通过对不同字段设置不同权重的方式改变查询结果的权重,从而影响结果排序。现在福哥要把这个技巧分享大家!

query_string

使用query_string将查询字段全部列出来,然后根据需要对于不同字段给予不同的加权分

{
  "bool": {
    "must": [
      {"match": {"doctype": 123456}},
      {
        "query_string": {
          "query": "福哥 andy",
          "fields": ["title^10", "keyword^8", "content"]
        }
      }
    ]
  }
}

设置查询条件为 doctype 为 123456,同时列出查询字段为 title、keyword、content,并且设置如果 title 字段匹配则得分乘10,如果 keyword 匹配则得分乘8,content 匹配不特别加分

这样的设置后,我们会发现查询结果更加符合用户的预期了。

boost

使用 should 和 boost 搭配达到为每个字段设置权重加倍的目的,boost 的作用是放大匹配字段在计算最终得分结果的权重。

字段的 boost 数值越大,字段如果匹配关键字的话,那么最终得分就会加更多分,文档的排序也就越靠前。

不过 boost 不是单纯的字段权重倍数,我们设置字段 title 的 boost 的数值为 6 并不意味着在字段 title 匹配时候权重值会高出 6 倍,这个具体的算法福哥会在今后的课程里详细给大家讲解的。

{
  "query": {
    "bool": {
      "must": [
        {"match": {"doctype": 123456}},
        {
          "bool": {
            "should": [
              {"match": {"title": {
                  "query": "福哥 andy",
                  "boost": 10
                }}},
              {"match": {"keyword": {
                  "query": "福哥 andy",
                  "boost": 8
                }}},
              {"match": {"content": {
                  "query": "福哥 andy",
                }}}
            ]
          }
        }
      ]
    }
  }
}

这个例子的设置是和 query_string 里的例子一样的效果,区别在于这样的写法我们还可以对每个字段进行更多的设置,自由度更高~~

总结

通过给不同字段设置不同的权重可以突出个别字段的重要性,从而可以让搜索结果的排序更加符合真是的情况,这种技巧可以应用在包含一个以上字段的文档的全文检索场景。

通常情况下,数值越短的字段其价值也就会越高。文章来说,标题命中比起正文命中价值要更高;网页来说,标题、关键字命中的网页价值也要比仅仅正文命中的网页要高。