Solr date field tdate vs date?

时间:2011-01-07 17:48:38

标签: date solr

所以我对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

3 个答案:

答案 0 :(得分:39)

通过预先计算某些范围结果并将它们作为单个记录存储在索引中,Trie字段可以更快地进行范围查询。为清楚起见,我的示例将使用十进制的整数。同样的概念适用于所有特里类型。这包括日期,因为日期可以表示为自1970年以来的秒数。

假设我们将数字12345678编入索引。我们可以将其标记为以下标记。

12345678
123456xx
1234xxxx
12xxxxxx

12345678标记表示实际的整数值。具有x数字的标记表示范围。 123456xx表示范围1234560012345699,并匹配包含该范围内令牌的所有文档。

注意列表中每个标记中的连续多个x位数。这由精确步骤控制。在我的例子中,你可以说我使用了2的精确步长,因为我修剪了2位数来创建每个额外的令牌。如果我使用3的精确步长,我会得到这些标记。

12345678
12345xxx
12xxxxxx

精确步骤4:

12345678
1234xxxx

精确步骤1:

12345678
1234567x
123456xx
12345xxx
1234xxxx
123xxxxx
12xxxxxx
1xxxxxxx

很容易看出较小的精确步骤如何产生更多的标记并增加索引的大小。但是,它也加快了范围查询。

如果没有trie字段,如果我想查询范围从1250到1275,Lucene必须获取25个条目(125012511252,..., 1275)并合并搜索结果。使用trie字段(精确步长为1),我们可以获取8个条目(125x126x127012711272127312741275),因为125x1250 - 1259的预先计算的聚合。如果我使用大于1的精度步长,查询将返回到获取所有25个单独的条目。

注意:实际上,精确步骤是指为每个标记修剪的位数。如果您要以十六进制编写数字,精确步长4将为每个标记修剪一个十六进制数字。精确步长为8将修剪两个十六进制数字。

答案 1 :(得分:11)

好问题:-)!我在某个地方读了一个很好的答案,遗憾的是再也找不到了。

基本上trie范围更快。 Here是一种解释。使用precisionStep,您可以配置索引可以增长多少以获得性能优势。引用您所指的链接:

“更重要的是,它不依赖于索引大小,而是取决于所选择的精度。”

“TrieRange的唯一缺点是索引大小稍微大一些,因为附加条款已编入索引”

答案 2 :(得分:3)

最好的办法是查看源代码。 Solr的一些东西没有很好的文档记录,获得可靠答案的最快方法是简单地查看代码。如果您尚未参与代码,那对您也有好处。至少从长远来看。

这是TrieTokenizerFactory的链接。

http://www.jarvana.com/jarvana/view/org/apache/solr/solr-core/1.4.1/solr-core-1.4.1-sources.jar!/org/apache/solr/analysis/TrieTokenizerFactory.java?format=ok

类中的javadoc至少提示了precisionStep的用途。你可以进一步挖掘。

编辑:我为你挖了一下。它直接传递给Lucene的NumericTokenStream类,它将在解析令牌流时使用该值。可能值得仔细研究。它似乎处理粒度,可能是索引中的大小和速度之间的权衡。