ElasticSearch自定义PayloadSearchPlugin

2020-05-29 00:00:00 多个 提供 插件 权重 青睐

近工作中遇到一个搜索需求:同一条数据有多个关键字,每个关键字具有不同的权重,搜索时,要可以根据关键字的权重进行排序。例如,有如下两条数据,括号中为权重:

  • id:0,商品:迪奥999口红,关键字:男性青睐(0.1) 女性青睐(0.9)
  • id:1,商品:玩家国度2080TI,关键字:男性青睐(0.9) 女性青睐(0.1)

搜索关键字男性青睐时,搜索时要以 1 0 的顺序返回;搜索女性青睐时,排序应该是 0 1。

当时考虑了两种方案解决这种需求:

方案一:父子文档,以上述数据为例,父文档为商品本身属性,子文档为每个关键字及其权重。

方案二:ElasticSearch提供了Delimited Payload Token Filter,利用Luncen的Payload机制来解决这类问题。

基于性能和索引结构简单性的考虑,决定采用第二种方案。

使用Delimited Payload Token Filter主要包括两个过程:数据索引过程、数据查询过程。其中数据索引过程,官方提供了详细文档表述,按部就班操作即可。详见:

Delimited payload token filterwww.elastic.co

数据查询过程相对复杂,官方并未提供一个现成的方案(可能是我没发现),需要自定义查询插件实现。起初打算看看网上是否有现成轮子,但是发现相关资料较少,只发现了一些基于较低版本实现的一些插件,由于版本之间改动较大,没法直接使用,只好参照这些插件并结合源码实现较高版本的插件。

这里附一个基于ElasticSearch 2.X开发的插件:

https://github.com/jprante/elasticsearch-payloadgithub.com

相关文章