elasticsearch 实现N抽二

在实际搜索中,如果商家信用良好,那有可能搜索的结果前几条都是该商家的,这样会引起其他商家的不满,因此需要干预一下排序,使每页一个商家最多显示两条商品。俗称N抽二,这在淘宝,天猫也是有此规则的。

在elasticseasrch中,对外暴露的接口不多,想了几天,最终采用elasticsearch 自带的聚合功能来实现,具体参见

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-scripted-metric-aggregation.html。

具体:

InitScriptFactory 初始化一个队列

MapScriptFactory 将商品ID, 商家ID, 分数放入队列

CombineFactory  对每个商家取top100,合并所有商家,再排序,并返回top1000

ReduceScriptFactory 对所有分片的数据进行排序,然后N抽二,默认20个桶,将所有数据往这个20个桶里放,如果发现这个桶已经满了,找下一个桶,否则,如果发现该桶内已有该商家的两个商品,也找下一个桶,否则可以放到这个桶内。对于那些没有放到任何桶内的商品,放到一个备用桶内,为后续的补位预留(有可能到最后有的桶没有满)。

这样就实现了N抽二的简单逻辑。当然这可能不是最优的方案,但是勉强能实现功能。

时间: 2024-08-10 23:20:35

elasticsearch 实现N抽二的相关文章

Elasticsearch Java API (二): index创建删除 cluster管理

Elasticsearch Java API (二): index创建删除 cluster管理  elastic官网有权威的java api 英文的 需要耐心看 这里整理下基本操作 创建maven工程添加依赖 <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>transport</artifactId> <version>5.2.2</ver

2018.2最新-Scrapy+elasticSearch+Django打造搜索引擎(二)

请问您今天要来个引擎吗? 工欲善其事必先利其器 最终项目上线演示地址: http://search.mtianyan.cn 第二节:我们搞搞比利,搞搞环境的搭建.Github地址: https://github.com/mtianyan/ArticleSpider IDE: pycharm 数据库: mysql, redis, elasticsearch 开发环境 virtualenv 这次的数据库只介绍mysql,后面两个会放到要用到的章节. Pycharm的安装和使用 Pycharm在win

Elasticsearch相关配置(二)

一.关于elasticsearch的基本概念 term 索引词,在elasticsearch中索引词(term)是一个能够被索引的精确值.foo,Foo Foo几个单词是不相同的索引词.索引词(term)是可以通过term查询进行准确的搜索. text 文本是一段普通的非结构化文字,通常,文本会被分析称一个个的索引词,存储在elasticsearch的索引库中,为了让文本能够进行搜索,文本字段需要事先进行分析:当对文本中的关键词进行查询的时候,搜索引擎应该根据搜索条件搜索出原文本. analys

Elasticsearch学习笔记(二)Search API 与 Query DSL

一. Search API eg: GET /mall/product/_search?q=name:productName&sort=price desc 特点:search的请求参数都是以HTTP请求的的query stirng 附带的 适用范围:适用于临时的在命令行使用一些工具,比如curl,快速的发出请求,来检索想要的信息: 适用于简单的查询条件 二.Query DSL 将Query DSL视为ASL查询则有两种类型的查询语句: 叶子查询语句(Leaf Query clause) : 叶

ElasticSearch笔记整理(二):CURL操作、ES插件、集群安装与核心概念

[TOC] CURL操作 CURL简介 curl是利用URL语法在命令行方式下工作的开源文件传输工具,使用curl可以简单实现常见的get/post请求.简单的认为是可以在命令行下面访问url的一个工具.在centos的默认库里面是有curl工具的,如果没有请yum安装即可. curl -X 指定http的请求方法 有HEAD GET POST PUT DELETE -d 指定要传输的数据 -H 指定http请求头信息 curl创建索引库 curl -XPUT http://<ip>:9200

Elasticsearch应用的十二个小案例

导入依赖 <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> </dependency> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticse

Elasticsearch入门学习(二):简单的入门学习

一.ES一些概念 索引 _inde,文档存储的地方,类似于关系型数据中的数据库. 事实上,数据被存储和索引在分片中,索引仅仅是一个把一个或者多个分片分组在一起的逻辑空间. 索引名字必须是全部小写,不允许以下划线开头,不能包含逗号. 文档 文档id是一个字符串,与_index组合时,就可以在ElasticSearch中唯一标识一个文档.创建文档时,可以自定义_id,也可以让ES帮助自动生成. 二.使用postman入门学习 创建索引 创建索引库的格式为:使用put请求:ip:9200/{index

Elasticsearch 之 Hello World (二)

首先测试下分词尤其是中文分词功能,这个可是传统数据库如mysql,sqlserver的痛啊. 打开浏览器,并登录到http://localhost:5601,点击Dev Tools项,在Console栏输入 POST _analyze { "analyzer": "standard", "text":"Hello World ElasticSearch" } 会在右面显示返回的结果 { "tokens":

ElasticSearch入门系列(二)交互API

一.基于HTTP协议,以JSON为数据交互格式的RESTful API 向ElasticSearch发出请求的组成部分与其他的普通的HTTP请求是一样的: curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>' VERD  HTTP方法:GET  POST  PUT   HEAD  DELETE PROTOCOL http或者