绊脚石乃是进身之阶。

倒排索引 数字和日期类型的问题

匿名 | 发布于2017年12月17日 | 阅读数:5883

网上大多数讲倒排索引都会拿一个文档和里面的内容做例子,其实就是一个field 里面的字符串内容分词后构建倒排索引以后简单的一个模型。但是如果field不再是文章字符串,而是数字,日期,这种情况下倒排索引又是如何构建的呢?难道从0到Integer.MAX_VALUE 每个数字构建一个和文档的关系吗?
日期如果也这么做就更可怕了,精确到毫秒下这种倒排列会更多,做范围查询效率会更低。倒排索引s又是如何处理数字日期这种数据呢
已邀请:

kennywu76 - Wood

赞同来自: ybtsdst code4j strglee laoyang360

早期ES/Lucene版本是将数值转换成字符串形式,利用倒排表做查找的。 为了解决离散的数值多带来的查找性能问题,Lucene在编排倒排表的时候,比较巧妙的引入了一些特殊的Term,比如"
50x75=[doc40,doc41,doc53,doc78,doc99,...]", 表示50-75这个范围的数值包含在后面哪些文档列表里。由此“
50 OR 51 OR 52 ... OR 100”这样的范围查找,被优化成类似“50x75 OR 76x99 OR 100"这样的形式。 对于该算法的详细解释参考: https://blog.parse.ly/post/1691/lucene/ 
 
从ES5.0版本(Lucene 6.0)开始,对于数值型字段,改用了k-d tree这种数据结构编码。 改用这种数据结构以后,数值型数据的索引以及范围查找效率比之前用倒排编码的方式提高很多。参考: https://www.elastic.co/blog/lucene-points-6.0
 

zhangg7723

赞同来自:

数字和日期不做分词

codepub

赞同来自:

IntPoint和StringField做主键,哪个更快???

要回复问题请先登录注册