实现主流搜索引擎广告置顶显示效果— Elastic Stack 实战手册

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 本应用实践,主要针对 Elasticsearch 如何实现类似百度广告置顶显示,给定商品数据的效果展开介绍,例如实现置顶显示某特定数据,像搜索某关键词,出现关联广告置顶显示的效果。

970X90.png

· 更多精彩内容,请下载阅读全本《Elastic Stack实战手册》

· 加入创作人行列,一起交流碰撞,参与技术圈年度盛事吧

创作人:铭毅天下
审稿人:李捷

本应用实践,主要针对 Elasticsearch 如何实现类似百度广告置顶显示,给定商品数据的效果展开介绍,例如实现置顶显示某特定数据,像搜索某关键词,出现关联广告置顶显示的效果。

举例:某搜索引擎 “电动汽车”,结果如下:

1.png

上面实现的本质:

返回结果的第一页头1条或多条数据是服务端(如电商网站、主流搜索引擎)指定的数据,而非按照相关度评分计算得出的结果数据。

这时候,不禁要问 Elasticsearch 能实现类似功能不 ?

拆解实现

Elasticsearch from + size 分页实现机制的原理(大致意思):

page 1:from 0,size:10——返回第 0 到 第 9 条数据。

page 2:from 10,size:10——返回第 0 到 第 19 条数据,截取第 10 到 第 19 条数据;

page 3:from 20,size:10——返回第 0 到 第 29 条数据,截取 第 20到 第 29 条数据。

......

本质是深度分页,肯定越往后翻页响应越慢。

要实现根据固定关键词,添加特定数据置顶显示的效果,探讨方案如下:

方案一:不重新分页,牺牲首页部分数据

不再做重新分页,强制将 page 1 部分数据,换成:类【广告位】置顶显示数据。

显然,会有数据丢失,导致搜索精准率下降,用户一般不会接受。

方案二:重新内存分页

将类【广告位】置顶显示数据 + 已有返回的前 10 页(举例:100 条数据)重新组合后,再分页。

需要内存维护一堆数据,有较大内存开销。用户期望翻页越深(比如:100页+),维护数据越大,处理越慢、延时会越明显。

方案三:其他方案

类主流搜索引擎实现的方法或者新的实现机制。

但此时要想,有没有更简洁的实现方式呢?

Elastic 官方没有考虑这个用户需求吗?

有的,从 Elasticsearch 7.4.0 新增的 pinned query 就能实现这种功能。

Pinned query 介绍

Pinned query 是 Elasticsearch 7.4.0 版本之后,实现的增强检索功能。

Pinned:中文翻译为“固定”。

Pinned query 则可以解释为——固定某些结果,首页置顶显示的检索方式。

下图能形象的说明:绿色的 Pinned results 就是要首页置顶显示的结果。

2.png

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 提升权重。

返回结果如下:

3.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” 包裹一层。其中的检索语句还是原来的写法 ,拷贝过来即可。

返回结果如下:

4.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 最大值评分,这样就能保证置顶显示了。

核心源码实现如下:

5.png

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

小结

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

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

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

参考:

创作人简介:
铭毅天下,Elastic 认证工程师、Elastic 官方合作培训讲师、阿里云 MVP、CSDN 博客
专家、铭毅天下 Elasticsearch 公众号作者、死磕 Elasticsearch 知识星球星主。近 10
年工作经验,关注 Elastic Stack 技术栈、大数据技术领域。
博客: https://elastic.blog.csdn.net/
相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
搜索推荐
带你读《Elastic Stack 实战手册》之70:——4.1.2.实现主流搜索引擎广告置顶显示效果(上)
带你读《Elastic Stack 实战手册》之70:——4.1.2.实现主流搜索引擎广告置顶显示效果(上)
103 0
带你读《Elastic Stack 实战手册》之70:——4.1.2.实现主流搜索引擎广告置顶显示效果(上)
|
云安全 数据采集 运维
《Elastic(中国)基础开发宝典》——跨任何环境搜索、观察和保护所有内容尽在Elastic 8.3版
《Elastic(中国)基础开发宝典》——跨任何环境搜索、观察和保护所有内容尽在Elastic 8.3版
《Elastic(中国)基础开发宝典》——跨任何环境搜索、观察和保护所有内容尽在Elastic 8.3版
|
自然语言处理 搜索推荐 NoSQL
带你读《Elastic Stack 实战手册》之70:——4.1.2.实现主流搜索引擎广告置顶显示效果(下)
带你读《Elastic Stack 实战手册》之70:——4.1.2.实现主流搜索引擎广告置顶显示效果(下)
105 0
|
SQL 存储 自然语言处理
ES 在舆情搜索中的实践- Elastic Stack 实战手册
网络舆情监测,主要是利用互联网信息采集技术,以及自然语言处理等智能信息处理技术,通过对互联网公开数据进行自动化抓取,然后对信息进行结构化、自动分类、文本聚类、主题发现与跟踪等,提供信息检索、多维度统计、敏感信息预警、信息简报、自动化报告等功能,帮助用户及时发现危害品牌形象的观点,并为用户分析关注对象在网络中的形象提供依据。
1221 0
ES 在舆情搜索中的实践- Elastic Stack 实战手册
|
数据采集 存储 搜索推荐
带你读《Elastic Stack 实战手册》之4:——3.2.1.企业搜索 (1)
带你读《Elastic Stack 实战手册》之4:——3.2.1.企业搜索 (1)
257 0
|
存储 搜索推荐
带你读《Elastic Stack 实战手册》之4:——3.2.1.企业搜索 (2)
带你读《Elastic Stack 实战手册》之4:——3.2.1.企业搜索 (2)
105 0
|
运维 前端开发 Devops
带你读《Elastic Stack 实战手册》之4:——3.2.1.企业搜索 (4)
带你读《Elastic Stack 实战手册》之4:——3.2.1.企业搜索 (4)
141 0
带你读《Elastic Stack 实战手册》之4:——3.2.1.企业搜索 (3)
带你读《Elastic Stack 实战手册》之4:——3.2.1.企业搜索 (3)
125 0
|
SQL 搜索推荐 数据库
带你读《Elastic Stack 实战手册》之29:——3.4.2.14.分页搜索(上)
带你读《Elastic Stack 实战手册》之29:——3.4.2.14.分页搜索(上)
122 0
|
索引
带你读《Elastic Stack 实战手册》之29:——3.4.2.14.分页搜索(下)
带你读《Elastic Stack 实战手册》之29:——3.4.2.14.分页搜索(下)