ElasticSearch自定义PayloadSearchPlugin
近工作中遇到一个搜索需求:同一条数据有多个关键字,每个关键字具有不同的权重,搜索时,要可以根据关键字的权重进行排序。例如,有如下两条数据,括号中为权重:
- 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 filter数据查询过程相对复杂,官方并未提供一个现成的方案(可能是我没发现),需要自定义查询插件实现。起初打算看看网上是否有现成轮子,但是发现相关资料较少,只发现了一些基于较低版本实现的一些插件,由于版本之间改动较大,没法直接使用,只好参照这些插件并结合源码实现较高版本的插件。
这里附一个基于ElasticSearch 2.X开发的插件:
https://github.com/jprante/elasticsearch-payload相关文章