[ElasticSearch] 三种方式进行ES检索评分控制

一、概要

在使用ES进行搜索时,评分的控制是非常关键的。

而如何对搜索评分进行定制化控制,让其更符合我们想要的评分结果呢?

  1. 对boost参数进行控制
  2. 通过rescore对查询结果的评分进行二次控制
  3. 使用function_score作为终极武器对评分进行函数控制

二、对比&&选择

boost

rescore

function_score

使用场景

在常规搜索中,经常使用boost进行评分的控制。

使用起来相对简单,但是控制度相对有限。

只能对单个字段进行控制,效果较为僵硬。

基于查询结果的二次查询方式对评分进行控制。

不会过多影响性能,可以解决大部分问题。

对评分进行函数控制,提供多种函数。

可以根据不同场景选择不同函数,解决多种评分需求。

但是会影响部分查询速率。

支持脚本形式自定义函数,作为终极解决方案。

三、应用实践

A、boost

1)概念

对于每次的查询可以使用boost参数来控制评分

2)实例

# 创建索引
PUT my_index
{
    "mappings":{
        "properties":{
            "content":{
                "type":"text"
                }
            }
        }
    }
}
# boost评分控制实例
POST /my_index/_search
{
    "query":{
        "bool":{
            "should":[
                {
                    "match":{
                        "content":{
                            "query":"文本A",
                            "boost":2
                        }
                    }
                },
                {
                    "match":{
                        "content":"文本B"
                    }
                }
            ]
        }
    }
}

B、rescore

1)概念

Rescore可以帮助提高精度,方法是仅重新排序由query和 post_filter阶段返回的文档 ,基于已查询到的文档进行Rescore操作,而不会作用于全文文档。

2)参数

参数

解读

query_weight

原始查询权重
rescore_query_weightrescore查询权重
score_mode

原始查询与rescore查询评分合并方式

  • multiply:分数相乘
  • total: 分数相加(默认)
  • avg:分数平均
  • max:最大的分数
  • min:最小的分数

3)DSL

POST /_search

{

   "query" : {

      "match" : {

         "message" : {

            "operator" : "or",

            "query" : "the quick brown"

         }

      }

   },

   "rescore" : {

      "window_size" : 50,

      "query" : {

         "rescore_query" : {

            "match_phrase" : {

               "message" : {

                  "query" : "the quick brown",

                  "slop" : 2

               }

            }

         },

         "query_weight" : 0.7,

         "rescore_query_weight" : 1.2,

         "score_mode":"total"

      }

   }

}

C、function_score

1)概念

function_score是用于处理文档分值的特殊DSL,它会在查询结束后对每一个匹配的文档进行一系列的重打分操作,最后以生成的最终分数进行排序。

2)多种function解读

  1. weight:你将分数乘以锁提供的权重。boost在特定查询会被规范化,而weight永远不会,值是浮点类型 
  2. random_score:生成一个在[0,1]之间的随机分数。 
  3. field_value_factor:利用一个 字段值进行类似函数的计算,但是不用编写脚本,避免开销。
    • field:指定字段名

    • modifier将字段值进行加工,有以下的几个选项:

      1. none:不处理
      2. log:计算对数
      3. log1p:先将字段值 +1,再计算对数
      4. log2p:先将字段值 +2,再计算对数
      5. ln:计算自然对数
      6. ln1p:先将字段值 +1,再计算自然对数
      7. ln2p:先将字段值 +2,再计算自然对数
      8. square:计算平方
      9. sqrt:计算平方根
      10. reciprocal:计算倒数
    • factor:对字段值进行预处理,乘以指定的数值(默认为 1)
  4. decay_functions:衰减函数,在给定范围区间内逐步衰减评分。

            衰减函数(Decay Function)提供了一个更为复杂的公式,它描述了这样一种情况:对于一个字段,它有一个理想的值,而字段实际的值越偏离这个理想值(无论是增大还是减小),就越不符合期望。这个函数可以很好的应用于数值、日期和地理位置类型,由以下属性组成:

    • 原点(origin):该字段最理想的值,这个值可以得到满分(1.0)
    • 偏移量(offset):与原点相差在偏移量之内的值也可以得到满分
    • 衰减规模(scale):当值超出了原点到偏移量这段范围,它所得的分数就开始进行衰减了,衰减规模决定了这个分数衰减速度的快慢
    • 衰减值(decay):该字段可以被接受的值(默认为 0.5),相当于一个分界点,具体的效果与衰减的模式有关

  5. script_score:可以自定义编写一个函数脚本,来自定义评分

3)参数

参数

解读

score_mode

函数计算影响字段的评分方式(效力于函数) 

 multiply:分数相乘(默认) 

 sum: 分数相加

  avg:分数平均 

 first:第一个方法匹配过滤被应用 

 max:最大的分数 

 min:最小的分数

boost_mode

函数分数与查询分数的计算方式(效力于最终的评分) 

 multiply:查询分数*函数分数相乘(默认)

  replace:只使用函数的分数,忽略查询的分数 

 sum:查询分数和函数分数相加

  avg:平均 

 max:取查询分数和函数分数中大的

  min:取查询分数和函数分数中小的

min_score查询分数小于该参数的文档,不进入函数计算中。

4)实例

# field_value_factor实例

# 有一个商品索引,包含字段 销量sales和title商品名称。

# 需求是查询"雨伞"商品 并根据销量进行评分的排序 此时选择field_value_factor非常合适

# 该DSL表示查询雨伞对应的商品  并且对销量sales字段的评分进行square(平方)处理,这样可以使得销量越高的商品评分越高

POST /_search

{

  "query": {

    "function_score": {

      "query": {

        "match": {

          "title": "雨伞"

        }

      },

      "field_value_factor": {

        "field": "sales",

        "modifier": "square"

      },

      "boost_mode": "sum"

    }

  }

}

  

# decay_functions实例

# 需求为:文档发布时间在10天及10天前的文档,评分进行衰减越来越低。

# 该DSL表示查询 文档内容中包含"中国"的文档,并且文档发布时间在10天内评分正常,发布时间超过10天的文档,评分逐步衰减,发布时间越远的评分越低!

{

  "query": {

    "function_score": {

     "query": {

        "match": {

          "content": "中国"

        }

      },

      "gauss": {

        "preview_time": {

          "origin": "1628650247300",

          "scale":  "864000",

          "offset": "8640000",

          "decay": 0.5

        }

      }

    }

  }

}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Elasticsearch(简称ES)是一个开源的分布式搜索和分析引擎,它基于Apache Lucene库构建而成。它被设计用于快速、可扩展和分布式的全文检索,以及实时数据分析。ES具有强大的搜索能力和高效的分布式架构,能够处理大规模数据的存储、搜索和分析。 ES的核心概念是索引(Index)、文档(Document)和类型(Type)。索引是包含一系列文档的逻辑容器,每个文档都是一个JSON格式的数据对象,可以被索引和搜索。类型是文档的逻辑分类,用于区分不同类型的文档。ES提供了丰富的搜索功能,包括全文搜索、过滤器、聚合等,通过使用查询语言来实现灵活的搜索需求。 ES的分布式特性使得它非常适合处理大规模数据。它使用分片(Shard)和复制(Replica)机制来实现数据的分布和冗余备份,提高了系统的可用性和扩展性。每个索引可以被划分为多个分片,每个分片可以被部署在不同的节点上,从而实现数据的并行处理和负载均衡。 除了全文检索外,ES还提供了丰富的数据分析功能。它支持实时的数据聚合和可视化,可以用于实时监控、日志分析、业务指标分析等场景。ES还可以与其他工具和框架集成,如Kibana(可视化工具)、Logstash(日志收集工具)等,形成完整的日志分析和监控系统。 总而言之,Elasticsearch是一个强大的全文检索和分析引擎,具有高效的搜索能力、可扩展的分布式架构和丰富的数据分析功能。它在各种场景下都能发挥重要作用,包括企业搜索、电商商品搜索、日志分析等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值