什么是倒排索引?
倒排索引,也常被称为反向索引、置入档案或反向档案,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。它是文档检索系统中最常用的数据结构。通过倒排索引,可以根据单词快速获取包含这个单词的文档列表。
笔者在最近的工作中开发了使用倒排索引去建立一个规则库实现匹配规则的功能。接下来通过一个场景来说明是如何实现的。
使用倒排索引存储规则
1.定义一些规则
规则1
性别:女
规则2
爱好:旅游
规则3
性别:女;爱好:旅游;
规则4
性别:女;爱好:旅游;职业:产品经理
扫描二维码关注公众号,回复: 5892922 查看本文章
规则5
性别:男;爱好:旅游;职业:产品经理
2.把完整规则的每一项拆开,统计每个规则项对应出现在哪些规则中
规则项 | 规则id |
---|---|
性别-女 | 1,3,4 |
爱好-旅游 | 2,3,4,5 |
性别-男 | 5 |
职业-产品经理 | 4,5 |
3.现在需要把规则项存到HashMap中,HashMap的key是规则项,value记录了该规则项包含的规则id列表。
此时我们已经使用HashMap建立好了一个规则库。接下来看如何匹配规则。
用户匹配规则
-
用户1
性别:女;爱好:旅游、读书;职业:产品经理
把用户1中的条件项拆散,去HashMap中查找key值下的规则列表。
-
性别-女: 拿到规则id列表:1,3,4
-
爱好-旅游: 拿到规则id列表:2,3,4,5
-
爱好-读书: 没有命中规则
-
职业-产品经理: 拿到规则id列表:4,5
现在可以统计每一条命中的规则的命中次数
规则id | 命中次数 |
---|---|
规则1 | 1 |
规则2 | 1 |
规则3 | 2 |
规则4 | 3 |
规则5 | 2 |
我们再分析一下每个规则里有多少个规则项,并且命中次数是否等于规则项数,如果相等,则该条规则完全命中。
规则id | 规则项数 | 命中次数 | 是否完全命中 |
---|---|---|---|
规则1 | 1 | 1 | 是 |
规则2 | 1 | 1 | 是 |
规则3 | 2 | 2 | 是 |
规则4 | 3 | 3 | 是 |
规则5 | 3 | 2 | 否 |
因此现在可以找出用户1能完全匹配到的规则为:规则1,规则2,规则3,规则4。
规则匹配还有一种范围匹配的场景,如需要匹配年龄是20-30区间的用户,后面也会介绍如何做范围匹配。