非通用内容搜索引擎(基于Elasticsearch 5.5.1)

最近做了一个基于Elasticsearch的非通用性的搜索引擎项目,工程量不大,但有意思的点却有好几个,这里做下记录把踩过的坑记录下来。

一、构建自己的查询分析模块

其实这不是本人第一次遇到要支持较丰富的语义(精确讲是语法)搜索,为了达到各种搜索条件,打造一个通用的搜索语法解析模块来支持功能强大、方便使用的目标。

该模块除了支持andnotor基本逻辑和无限嵌套子句(代表括号),让使用方以流式接口调用,方式极为便利。同时加入了field上的rangelessThangreatThaninnotIncontainsstartWithfuzzyWith等各种比较和对比语义查询。其中最有意思的语法是类似于sql likecontainsstartWith语义(基于短语或句子的wildcard语法)。为了达到搜索本意,模块实现如下:

1、调用分词器(如ik分词器),将句子按照ik_max_word分词(注意不是专为搜索用的ik_smart),为了给SpanNearQueryBuilder使用;

2、contains语义的第一个词前加*,最后一个词加上*startWith最后一个词加上*,达到wildcard效果;

3、使用SpanNearQueryBuilder将各个分词后词,组合起来。特别说明的是wildcard类型必须转换成spanMultiTermQuery,正常term使用spanTermQuery关联,每个词slot间隔距离为0

4、fuzzyWith目前用于相似图片搜索,限制相对较多,需要改进核心图片标记算法改进后才行。

二、更丰富的Lucene数据类型

由于本项目要查询的部分内容为聚合内容,所以使用Lucenearray类型,该类型支持中文分词,同时也可以在各个array item之间设置距离,让不同item之间的内容不容易被当做相邻内容搜到,使用方式上很灵活。使用好ES的参数很为重要:position_increment_gap100

三、图片模糊查询

图片相似度查询就fuzzy search,改查询实际的技术核心在于图片标志的计算,由fuzzyWith来表达。

四、聚合查询

目前Elasticsearch基本聚合已经做得很好,一些基本group by需求已经完全满足使用,本项目聚合相对较多,但并没有特别之处所以不做多余说明。

Elasticsearch母公司已经上市了,说明搜索实为IT系统刚需性产品,Lucene本身又很强大和通用,所以只要多多挖掘,大部分特性和场景都能在Elasticsearch中满足。

猜你喜欢

转载自www.cnblogs.com/blackjazz07/p/9806983.html