ES中如何实现对查询结果的二次排序

简介: ES中如何实现对查询结果的二次排序

一、场景说明


比如我们在CSDN中根据输入的关键词搜索博客文章,需要先根据关键词的相似度匹配排序,然后根据博客热度进行二次排序,保证热度比较高的博客文章优先被搜索到,提高用户的搜索体验。

那么,如何在ES中对检索结果进行二次排序呢?


二、误区说明


索引blog,有三个字段,博客标题title,博客内容content,博客的访问量access_num。

PUT /blog
{  
  "mappings": {
     "properties": {
      "content": {
        "type": "text",
        "analyzer": "ik_max_word",
        "search_analyzer": "ik_smart"
      },
      "title": {
        "type": "text",
        "analyzer": "ik_max_word",
        "search_analyzer": "ik_smart"
      },
      "access_num": {
        "type": "integer"
      }
    }
  }
}


检索关键词:java入门

要求:查询结果先根据匹配评分排序,再根据访问量排序。


SQL查询实现:


POST /_sql?format=txt
{
  "query": "SELECT title  FROM blog where MATCH(title, 'java入门') order by  SCORE() DESC,access_num DESC" 
}


一般情况下,我们的实现思路都是按照上面的sql进行二次排序。


问题说明:

假如现在有100万条记录能匹配上java入门关键字,先对这100万匹配的数据根据评分SCORE排序,然后再根据访问量排序,会出现如下问题

问题一:

一般全文检索时,只需要返回前面几千条记录即可,一般用户只关注匹配度最高的结果。


问题二:

通过order by SCORE() DESC,access_num DESC这样进行二次排序,那些评分较低、但是访问量较高的文章,会被排在后面,用户体验非常差。


问题三:

ES默认的match匹配打分规则,只是基于检索词的相似度词频打分,没有关联索引中的其他字段,不能实现基于title的相似度和访问量access_num组合评分。


三、优化方案


简单的一个优化思路是,先从查询结果中返回评分最高的100条记录,这100条记录再根据访问量倒序排序。

这样即可以保证评分最高的优先返回,也能保证访问量更高的被优先访问。


实现的SQL如下:


SELECT
  * 
FROM
  ( SELECT title, access_num FROM blog WHERE MATCH ( title, 'java入门' ) ORDER BY SCORE () DESC LIMIT 100 ) 
ORDER BY
  access_num DESC


存在的问题:

1、ES中不支持这种子查询,只能先查询出前100条记录,然后在程序中进行二次排序。

2、这种文章的相关度和访问量的二次排序太简单粗暴,可能文章名完全匹配的文章由于访问量比较低而不能优先被访问到,用户体验度始终不好。


补充:

通过再次评分机制rescore,可以实现对指定数据的查询结果进行二次排序。


四、终极优化


针对这种情况,更好的方式是给特定索引的全文检索查询定制打分规则,关联更多的字段信息去打分,这样就可以直接根据评分倒序排序获取前100条记录即可。


function_score 查询 是用来控制评分过程的终极武器,它允许为每个与主查询匹配的文档应用一个函数,以达到改变甚至完全替换原始查询评分 _score 的目的。

GET /blog/_search
{
    "query": {
        "function_score": {
            "query": {
                "match": {
                    "title": "java入门"
                }
            },
            "functions": [
                {
                    "script_score": {
                        "script": {
                            "params": {
                                "access_num_ratio": 2.5
                            },
                            "lang": "painless",
                            "source": "doc['access_num'].value * params.access_num_ratio "
                        }
                    }
                }
            ]
        }
    }
}

总结


本文主要是通过对ES中如何实现对查询结果的二次排序问题的思考,延展说明了ES中通过设置索引中的多个字段的权重来联合打分,从而优化用户的检索体验。

目录
相关文章
|
消息中间件 数据安全/隐私保护 RocketMQ
消息队列 MQ产品使用合集之如何自定义时间间隔
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
11月前
|
存储 人工智能 分布式计算
ALink System亮相CCF中国存储大会 凝聚Scale Up互连共识
在首届CCF中国存储大会上,阿里云服务器研发团队带来最新的UALink联盟进展,以及ALink System产业生态在国内的落地现状。
|
运维 搜索推荐 调度
Ha3搜索引擎简介
Ha3是阿里巴巴搜索团队开发的搜索引擎平台,它为阿里集团包括淘宝、天猫在内的核心业务提供搜索服务支持。
24642 1
|
存储 人工智能 搜索推荐
RAG系统的7个检索指标:信息检索任务准确性评估指南
大型语言模型(LLMs)在生成式AI领域备受关注,但其知识局限性和幻觉问题仍具挑战。检索增强生成(RAG)通过引入外部知识和上下文,有效解决了这些问题,并成为2024年最具影响力的AI技术之一。RAG评估需超越简单的实现方式,建立有效的性能度量标准。本文重点讨论了七个核心检索指标,包括准确率、精确率、召回率、F1分数、平均倒数排名(MRR)、平均精确率均值(MAP)和归一化折损累积增益(nDCG),为评估和优化RAG系统提供了重要依据。这些指标不仅在RAG中发挥作用,还广泛应用于搜索引擎、电子商务、推荐系统等领域。
6208 2
RAG系统的7个检索指标:信息检索任务准确性评估指南
|
负载均衡 安全 调度
深入调查研究Docker Swarm
【10月更文挑战第19天】
274 0
|
自然语言处理 数据挖掘 定位技术
深入探索Elasticsearch中的QueryBuilders
深入探索Elasticsearch中的QueryBuilders
927 0
|
存储 TensorFlow API
深度学习系统设计(二)(5)
深度学习系统设计(二)
285 1
|
存储 机器学习/深度学习 API
高维向量搜索:在 Elasticsearch 8.X 中利用 dense_vector 的实战探索
高维向量搜索:在 Elasticsearch 8.X 中利用 dense_vector 的实战探索
高维向量搜索:在 Elasticsearch 8.X 中利用 dense_vector 的实战探索
|
存储 人工智能 API
推荐一款强大的AI开源项目!有了它,将你的数据库秒变AI数据库!
推荐一款强大的AI开源项目!有了它,将你的数据库秒变AI数据库!
537 1
|
机器学习/深度学习 运维 搜索推荐
机器学习中准确率、精确率、召回率、误报率、漏报率、F1-Score、AP&mAP、AUC、MAE、MAPE、MSE、RMSE、R-Squared等指标的定义和说明
在机器学习和深度学习用于异常检测(Anomaly detection)、电子商务(E-commerce)、信息检索(Information retrieval, IR)等领域任务(Task)中,有很多的指标来判断机器学习和深度学习效果的好坏。这些指标有相互权衡的,有相互背向的,所以往往需要根据实际的任务和场景来选择衡量指标。本篇博文对这些指标进行一个梳理。
机器学习中准确率、精确率、召回率、误报率、漏报率、F1-Score、AP&mAP、AUC、MAE、MAPE、MSE、RMSE、R-Squared等指标的定义和说明