我爱北京天安门,我想这么分词,
我: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 最新编辑 ==============
完美实现了搜索和高亮效果
我: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 最新编辑 ==============
完美实现了搜索和高亮效果
3 个回复
Ombres
赞同来自: yuechen323
ik源码找Tokenizer的子类,incrementToken方法,在这里进行你的分词改造就好,termAtt这个对象是每个分出的词
Charele - Cisco4321
赞同来自:
“我爱北京天安门”去分词,里面没有冒号,没有1,怎么能分出这些东西来啊?
dotNetDR_ - elasticsearch 6.x
赞同来自: