Yhzhtk / note

知识代码笔记
https://github.com/Yhzhtk/note/issues
MIT License
108 stars 11 forks source link

Lucene 数值型范围查找原理 #47

Open Yhzhtk opened 6 years ago

Yhzhtk commented 6 years ago

原始方案

  1. 通过补位的方式,如 3, 13, 133 补位为 003, 013, 133,然后通过顺序索引查找
  2. 通过boolean or 的方式查找,比如查询 [13, 133],则组装多个 13 or 14 or 15....or 133的方式

显然,上述两种方式都存在较大问题,补位补多少个0并不确定,or 条件太多性能会极差,超过限制会抛出异常。

新方案

  1. 将所有数值编码,满足编码前单调递增,编码后也是单调递增,比如 float 转 int,data 转 getTime,货币也转为分值 long
  2. 构建一棵 trie 树,使用前缀分词,比如 423 分词为 4, 42, 423,构建一棵 trie 树,由于索引是二进制,则会考虑 precisionStep,决定多少位分一个词
  3. 查询的时候,不断追溯父节点,直到找到公共的父节点,然后取范围,见下图
  4. 另外,需要区分 4 和 423 中的 4 是不一样的,所以会额外存在一个 shift 表示单位

image

作者介绍PPT Schindler-TrieRange.ppt