2011-01-07 6 views
32

Итак, у меня есть вопрос о типах полей типа Solr, который довольно прямолинейный: в чем разница между полем «дата» и «tdate»?Поле даты дат с датой?

Схема .xml утверждает, что «для более быстрых запросов диапазона рассмотрите тип tdate» и «Поле даты на основе Trie» для более быстрых запросов диапазона дат и факела даты. ' Достаточно честный ... но что такое precisionStep = "6"? я должен это изменить? изменяет ли он способ создания запроса в случае использования tdate? Какое реальное преимущество или что делает Solr, что делает его лучше?

PS прошел через Google, Solr руководство, Solr вики и ява документы без каких-либо удачи, так что я был бы признателен вид и пояснительный ответ:) ... Также проверено: http://www.lucidimagination.com/blog/2009/05/13/exploring-lucene-and-solrs-trierange-capabilities/ http://web.archiveorange.com/archive/v/AAfXfqRYyLnDFtskmLRi

+4

5 лет спустя, по-прежнему такая же ситуация с Google, Solr manual, solr wiki и т. Д. О, нет, что-то изменилось: теперь Google указывает здесь :) – alisa

ответ

11

Хороший вопрос :-)! Я где-то читал хороший ответ, к сожалению, не могу найти это снова.

В основном диапазоны трии быстрее. Here - одно объяснение. С помощью функции precisionStep вы определяете, насколько ваш индекс может расти, чтобы получить преимущества по производительности. Цитируя ссылку, вы имеете в виду:

«Что еще более важно, это не зависит от размера индекса, а вместо выбранной точности».

и

«единственные недостатками TrieRange являются немногими большими размерами индекса, из-за дополнительными условиями индексируемых»

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. Вы могли бы копать все дальше.

EDIT: Я выкопал еще немного для вас. Он передается непосредственно классу NumericTokenStream Lucene, который будет использовать значение при разборе потока токенов. Возможно, стоит поближе рассмотреть. Это, по-видимому, касается детализации и, вероятно, является компромиссом между размером индекса и скоростью.

+0

Неплохо, спасибо за ответы ... Я также нашел приятный сообщение в форумах Lucene, в котором немного уточняется, что такое сделка с tdate ... По-видимому, это только то, как Solr индексирует поле и его размер: http://lucene.472066.n3.nabble.com /Best-performance-for-facet-dates-in-trunk-using-solr-TrieDateField-td487668.html Помимо параметров размера индекса и производительности, я не нашел другого материала, который нужно будет изменить в случае использования опции tdate. –

37

TRIE поле делает диапазон запросы быстрее, предварительно рассчитав определенные результаты дальности и хранение их как одну запись в индексе. Для ясности мой пример будет использовать целые числа в базе десять. Эта же концепция применяется ко всем типам 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

Удивительное объяснение. Я читал часами, пытаясь понять точность шагов, и это первое объяснение, которое имело смысл. –

+0

Обратите внимание, что секунды с 1970 года - это не просто теоретический способ сделать это. Это действительно так, как это делается, и если у вас есть поле с нулевой датой, оно будет считаться 0 секундой с 1970 года. В результате упорядочиваются поля с нулевым и нулевым полями trie date. Вы получаете даты до 1970 года, нулевые значения, а затем даты после 1970 года. – mlissner