问题背景
有朋友问我题目中的这个问题。我愣了一下,然后马上脑海想起来的就是各种骚操作,继承lucene接口,重实现哪些类然后打成jar包丢到lib目录下重新启动等等等等……无一不是天秀的操作,都是能写个博客写半天的那种。然后我认真的和他讨论了下可行性,直到他问我们生产环境怎么操作的,我突然反应过来,我在画蛇添足。确实自己编写插件的办法很酷,但是其实有非常非常简单的办法。
解决思路
分词这个动作无论你用python做用scala做用乱七八糟没听过的语言做都没关系,只需要将它封装成http服务对外暴露即可。然后我们的数据在入索引的时候先通过分词接口进行分词,接下来按空格隔开,如下这样。
原文本: 澡子哥疯狂输出砍下2800
分词后:澡子哥 疯狂 输出 砍 下 2800
接下来是重点,在建立索引的时候在mapping(solr还是es还是其他lucene衍生产品都适用)里把原本要存的字段定义为空格分词
这就是整个方法中最重要的一环,当我们搜索的时候,只需要把query同样也经过自定义分词后提交,如下
原query: 澡子哥2800
分词后:澡子哥 2800
然后用分词后的结果在空格分词字段搜索即可得到同样的效果。
总结
其实是个很简单的方法,文章也比较标题党,但真是在有人问我以后我才反应过来一直在使用的这个流程上当初的这个设计考虑初衷。简单的方法就是最好的。
当然其实最cool的办法还是说根据文档实现插件,打成jar包提交到lib目录重新启动,关于如何编写es插件请参考我的这篇博客
ElasticSearch插件编写-Similarity插件