所以我对Solr的字段日期类型有一个问题,这是非常直接的:'date'字段和'tdate'字段之间有什么区别?
架构.xml声称“对于更快的范围查询,请考虑tdate类型”和“基于特里的日期”字段,以便更快地查找日期范围和日期分面。 “ 足够公平......但究竟什么是precisionStep =“6”?我该改变吗?如果我使用tdate,它会改变我创建查询的方式吗?什么是真正的优势或Solr做了什么使它变得更好?
P.S经过谷歌,Solr手册,solr wiki和java文档没有任何运气,所以我很感激一个善意和解释性的答案:)... 还检查: http://www.lucidimagination.com/blog/2009/05/13/exploring-lucene-and-solrs-trierange-capabilities/ http://web.archiveorange.com/archive/v/AAfXfqRYyLnDFtskmLRi答案 0 :(得分:39)
通过预先计算某些范围结果并将它们作为单个记录存储在索引中,Trie字段可以更快地进行范围查询。为清楚起见,我的示例将使用十进制的整数。同样的概念适用于所有特里类型。这包括日期,因为日期可以表示为自1970年以来的秒数。
假设我们将数字12345678
编入索引。我们可以将其标记为以下标记。
12345678
123456xx
1234xxxx
12xxxxxx
12345678
标记表示实际的整数值。具有x
数字的标记表示范围。 123456xx
表示范围12345600
到12345699
,并匹配包含该范围内令牌的所有文档。
注意列表中每个标记中的连续多个x
位数。这由精确步骤控制。在我的例子中,你可以说我使用了2的精确步长,因为我修剪了2位数来创建每个额外的令牌。如果我使用3的精确步长,我会得到这些标记。
12345678
12345xxx
12xxxxxx
精确步骤4:
12345678
1234xxxx
精确步骤1:
12345678
1234567x
123456xx
12345xxx
1234xxxx
123xxxxx
12xxxxxx
1xxxxxxx
很容易看出较小的精确步骤如何产生更多的标记并增加索引的大小。但是,它也加快了范围查询。
如果没有trie字段,如果我想查询范围从1250到1275,Lucene必须获取25个条目(1250
,1251
,1252
,..., 1275
)并合并搜索结果。使用trie字段(精确步长为1),我们可以获取8个条目(125x
,126x
,1270
,1271
,1272
,1273
,1274
,1275
),因为125x
是1250
- 1259
的预先计算的聚合。如果我使用大于1的精度步长,查询将返回到获取所有25个单独的条目。
注意:实际上,精确步骤是指为每个标记修剪的位数。如果您要以十六进制编写数字,精确步长4将为每个标记修剪一个十六进制数字。精确步长为8将修剪两个十六进制数字。
答案 1 :(得分:11)
好问题:-)!我在某个地方读了一个很好的答案,遗憾的是再也找不到了。
基本上trie范围更快。 Here是一种解释。使用precisionStep,您可以配置索引可以增长多少以获得性能优势。引用您所指的链接:
“更重要的是,它不依赖于索引大小,而是取决于所选择的精度。”
和
“TrieRange的唯一缺点是索引大小稍微大一些,因为附加条款已编入索引”
答案 2 :(得分:3)
最好的办法是查看源代码。 Solr的一些东西没有很好的文档记录,获得可靠答案的最快方法是简单地查看代码。如果您尚未参与代码,那对您也有好处。至少从长远来看。
这是TrieTokenizerFactory的链接。
类中的javadoc至少提示了precisionStep的用途。你可以进一步挖掘。
编辑:我为你挖了一下。它直接传递给Lucene的NumericTokenStream类,它将在解析令牌流时使用该值。可能值得仔细研究。它似乎处理粒度,可能是索引中的大小和速度之间的权衡。