带你读《Elastic Stack 实战手册》之70:——4.1.2.实现主流搜索引擎广告置顶显示效果(下)

本文涉及的产品
Elasticsearch Serverless通用抵扣包,测试体验金 200元
简介: 带你读《Elastic Stack 实战手册》之70:——4.1.2.实现主流搜索引擎广告置顶显示效果(下)


《Elastic Stack 实战手册》——四、应用实践——4.1 企业搜索应用场景 ——4.1.2.实现主流搜索引擎广告置顶显示效果(上) https://developer.aliyun.com/article/1226383


Pinned query 实战实现

 

基础数据 Demo 如下,直接拿文章开头的截图示例模拟一下,假设 id为 1、2、3 的3条数据是需要特意置顶显示的数据

 

PUT index_001
{
  "mappings": {
    "properties": {
      "title":{
        "type": "text",
        "analyzer": "ik_max_word",
        "fields": {
          "keyword":{
            "type":"keyword"
          }
        }
      }
    }
  }
}
PUT index_001/_bulk
{"index":{"_id":1}}
{"title":"大众汽车首款纯电动ID.4_预售进行时_先订先享"}
{"index":{"_id":2}}
{"title":"保时捷首款纯电动跑车Taycan - 现已到店 - 电驰神往"}
{"index":{"_id":3}}
{"title":"纯电动电动汽车?英国国际贸易部_邀您来投资英国汽车工业"}
{"index":{"_id":4}}
{"title":"四轮电动车_ 电动汽车报价_阿里巴巴采购批发_超多品类低价批发"}
{"index":{"_id":5}}
{"title":"电动汽车之家,为新能源汽车而生 - 第一电动网"}
{"index":{"_id":6}}
{"title":"中国电动汽车网_新能源汽车_电动汽车网"}
{"index":{"_id":7}}
{"title":"电车之家_领先的电动汽车及新能源汽车行业门户网站"}

如果要召回既包含:“电动汽车” 完全匹配,又包含“电动”或“汽车” 分词匹配的全量数据。大致的检索语句如下:


POST index_001/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match_phrase": {
            "title": {
              "query": "电动汽车",
              "boost": 5
            }
          }
        },
        {
          "bool": {
            "should": [
              {
                "match": {
                  "title": "电动"
                }
              },
              {
                "match_phrase": {
                  "title": "汽车"
                      }
              }
            ],
            "minimum_should_match": 2
                  }
        }
      ]
    }
  }
}

如上检索部分:完全匹配加了 boost 提升权重。

 

返回结果如下:

 

image.png


返回结果按照评分由高到低顺序排列,_id 序列为:5、7、3、6、4 ......

 

置顶显示_id 为 1、2、3 的数据,pinned query 实现如下:

GET index_001/_search
{
  "query": {
    "pinned": {
      "ids": [
        "1",
          "2",
        "3"
      ],
      "organic": {
        "bool": {
          "should": [
            {
              "match_phrase": {
                "title": {
                  "query": "电动汽车",
                  "boost": 5
                }
              }
            },
            {
              "bool": {
                "should": [
                  {
                    "match": {
                      "title": "电动"
                    }
                  },
                  {
                    "match_phrase": {
                      "title": "汽车"
                    }
                  }
                ],
                "minimum_should_match": 2
              }
            }
          ]
        }
      }
    }
  }
}

本质是在原来检索语句的基础上,添加了如下部分代码:

"pinned": {
     "ids": [
       "1",
       "2",
         "3"
     ],
     "organic": {

第一:置顶显示的 id ,写法如下:

 

第二:除了置顶数据之外的其余正常检索语句块内容。只是加了“organic” 包裹一层。其中的检索语句还是原来的写法 ,拷贝过来即可。

 

返回结果如下:


image.png


返回结果已 pinned(类似做了“广告位”定制),_id 序列为:1、2、3、5 ....... 实现了类百度置顶显示广告的效果。

 

Pinned query 源码解读

 

认知前提:源码中最大评分计算方法


float MAX_ORGANIC_SCORE = Float.intBitsToFloat((0xfe << 23)) - 1;

本质上与下面代码等价:


float max_rst  = (float)Math.pow(2,127);//1.7014118E38

也就是说:MAX_ORGANIC_SCORE 大小为:2 的 127 次幂,是 Elasticsearch float 最大值。

 

最大评分作用

 

正常查询的评分得分不会超过 MAX_ORGANIC_SCORE, 将固定查询(pinned query)的评分设定为:MAX_ORGANIC_SCORE。

 

pinned query 保证置顶显示解密

 

原理:将置顶显示的数据通过 bool 组合查询 + boost 提升权重的方式给设置了 float 最大值评分,这样就能保证置顶显示了。

 

核心源码实现如下:


image.png


注意细节没有深究,比如:置顶返回的结果显示的是原始评分。

 

小结

 

读者可能会问:这并没有实现基于特定关键词返回特定数据的需求?其实有了pinned query 再将特定关键词与待置顶显示文章 _id ,建立个一对多的映射关系就可以实现。映射关系可以自己内存维护或者借助 redis 实现都可以。

 

你我发现的新需求,很可能别人早就发现,且已经提交 Git了。更可怕的是:官方新版本已经实现了!

 

要注重基础夯实的同时,多关注一下技术动态。两手抓、两手都要硬!

 

参考

 

l https://www.elastic.co/guide/en/elasticsearch/reference/7.4/release-notes-7.4.0.html

 

创作人简介

铭毅天下,Elastic 认证工程师、Elastic 官方合作培训讲师、阿里云 MVP、CSDN 博客专家、铭毅天下 Elasticsearch 公众号作者、死磕 Elasticsearch 知识星球星主。近 10年工作经验,关注 Elastic Stack 技术栈、大数据技术领域。

博客:https://elastic.blog.csdn.net/

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。 &nbsp;
相关文章
|
2月前
智谱发布GLM-4.5V,全球开源多模态推理新标杆,Day0推理微调实战教程到!
视觉语言大模型(VLM)已经成为智能系统的关键基石。随着真实世界的智能任务越来越复杂,VLM模型也亟需在基本的多模态感知之外,逐渐增强复杂任务中的推理能力,提升自身的准确性、全面性和智能化程度,使得复杂问题解决、长上下文理解、多模态智能体等智能任务成为可能。
385 0
|
11月前
|
监控 网络协议 算法
Linux内核优化:提升系统性能与稳定性的策略####
本文深入探讨了Linux操作系统内核的优化策略,旨在通过一系列技术手段和最佳实践,显著提升系统的性能、响应速度及稳定性。文章首先概述了Linux内核的核心组件及其在系统中的作用,随后详细阐述了内存管理、进程调度、文件系统优化、网络栈调整及并发控制等关键领域的优化方法。通过实际案例分析,展示了这些优化措施如何有效减少延迟、提高吞吐量,并增强系统的整体健壮性。最终,文章强调了持续监控、定期更新及合理配置对于维持Linux系统长期高效运行的重要性。 ####
|
11月前
|
机器学习/深度学习 人工智能 自然语言处理
探索深度学习与自然语言处理的前沿技术:Transformer模型的深度解析
探索深度学习与自然语言处理的前沿技术:Transformer模型的深度解析
474 1
|
存储 前端开发 测试技术
前后端分离后灰度发布实现方式
前后端分离后灰度发布实现方式
335 3
|
弹性计算 自然语言处理 API
速成RAG+Agent框架大模型应用搭建
本文侧重于能力总结和实操搭建部分,从大模型应用的多个原子能力实现出发,到最终串联搭建一个RAG+Agent架构的大模型应用。
|
Java 开发者
javafx jlink 遇到的非模块化的依赖打包报错“模块异常”的问题和处理
【9月更文挑战第18天】在使用JavaFX的jlink进行应用打包时,非模块化依赖可能导致“模块异常”报错。此文档详细分析了该问题的原因,并提供了四种解决方案:模块化依赖、自动模块转换、手动创建模块描述符及检查模块依赖关系。通过这些方法,可以有效解决此类问题,提高项目的可维护性和扩展性。建议开发者优先选用模块化设计。
948 1
|
算法 测试技术 API
测试使用 SenseVoice 的流程
8月更文挑战第10天
957 8
form-data 与 x-www-form-urlencode有何区别?
在客户端和服务器之间传递数据既可以使用`form-data` ,又可以使用 `x-www-form-urlencoded` 。但是在使用时你有注意它们的区别吗?
490 2
|
存储 JSON Java
【字节跳动青训营】后端笔记整理-1 | Go语言入门指南:基础语法和常用特性解析(三)
在 Go 语言里,符合语言习惯的做法是使用一个单独的返回值来传递错误信息。
209 0