三人行必有我师

修改分词器源码减少filter过滤的性能损耗

Elasticsearch | 作者 yuechen323 | 发布于2021年06月07日 | 阅读数:1514

我爱北京天安门,我想这么分词, 
我:1 
爱:1 
北京:1
天安门:1

也就是说要加上冒号一个业务id,比如: regionid,按照不同的地区划分
我不想创建多个索引,因为 region 有几千个,甚至上 w,一个 region 对应一个索引 es 受不了, 已经测试过了
这个业务 id 正常是需要用 filter过滤的, 如: 
先 match 查询, 然后 filter 过滤 regionId,    
看到了吧, 是需要两步才可以完成, 我想一步就搞定, 因此分词的时候要带上 regionId, 那么光 match 查询就搞定了
 
1. 创建索引的时候, 我这样将原字符串传给分词器
[RegionId-1-RegionId]我爱北京天安门
分词器, 截取 [RegionId-1-RegionId] , 知道了这是 regionId 为 1 的文本, 因此分词完在倒排索引这么存
我:1 - doc1, doc2, doc3
爱:1 - doc1, doc10, doc11
北京:1- doc2, doc200
天安门:1 - doc1, doc5
 
2. 搜索时候, 我在用户搜索的字符串前面拼接上这个前缀, 如:  [RegionId-1-RegionId]天安门, 然后经过我的 search_analyzer 就变成了 天安门:1,  正好倒排索引里面是有这个的

我为什么要这么做 ? 我看过 Dropbox 自己开发的一套搜索引擎就是这么搞的, 他没用es, 因为不满足他们的要求, 这么做的好处就是通过包含业务属性的分词直接过滤了大量数据

请问有朋友能提供下思路吗,ik分词器源码我是看了一下,不太了解要修改的具体位置,有朋友知道ik源码如何结合es调试吗
 
============== 2021-06-11 最新编辑 ==============
完美实现了搜索和高亮效果

1623378313388.jpg

 

 
已邀请:

Ombres

赞同来自: yuechen323

思路不错,学习了!
ik源码找Tokenizer的子类,incrementToken方法,在这里进行你的分词改造就好,termAtt这个对象是每个分出的词

Charele - Cisco4321

赞同来自:

能描述清楚一点吗?我没看明白,
“我爱北京天安门”去分词,里面没有冒号,没有1,怎么能分出这些东西来啊?

dotNetDR_ - elasticsearch 6.x

赞同来自:

filter后与match结果做并集是整条查询的性能瓶颈吗?想请教下怎么查出这个结论的?

要回复问题请先登录注册