2012-01-10 3 views
1

Мы запускаем Solr 3.4 и имеем относительно небольшой индекс 90 000 документов или около того. Эти документы разбиты на несколько логических источниках, и поэтому каждый поиск будет иметь прикладной запрос фильтра для конкретного источника, например:Solr * vs *: * Выполнение запросов

?q=<query>&fq=source:<source> 

где source является классическим строковым полем. Мы используем edismax и имеем поле поиска по умолчанию текст.

В настоящее время мы видим q=*, в среднем в 20 раз дольше, чем q=*:*. Разница довольно заметна: *:* занимает 100 мс и * занимает до 3500 мс. Поиск общего слова в наборе документов (сопоставление почти 50% всех документов) вернет результат менее чем за 200 мс.

Глядя на запросы с debugQuery, мы можем видеть, что * разбирается в DisjunctionMaxQuery((text:*)), в то время как *:* разбирается в MatchAllDocsQuery(*:*). Это имеет смысл, но я все еще не чувствую, что это объясняет замедление этой величины (замедление 2000% по сравнению с чем-то, что соответствует 50% документов).

Что может быть причиной этого? Есть ли что-нибудь, что мы можем настроить?

ответ

2

Когда вы проходите всего *, вы заказываете, чтобы проверить каждое значение в поле и сопоставить его с *, и это много сделать. Однако, когда вы используете * : *, вы просите Solr дать вам все и пропустить любое совпадение.

Solr/Lucene оптимизирован, поэтому * : * быстро и эффективно!

+0

Почему так много медленнее, чем поиск любого другого общего слова? 'text: foo' невероятно быстро по сравнению с' text: * ', независимо от того, сколько документов согласовано с foo. Разумеется, поиск поля: * должен быть в состоянии отказаться от любого фактического соответствия по содержимому поля, если он существует? –

+1

Потому что * соответствует всем, и это дорого. Я не так много знаю о Lucene, но считаю, что поиск терминов заключается в использовании более оптимизированных данных, а затем при поиске * в каждом значении поля. Пожалуйста, прочитайте: http://lucidworks.lucidimagination.com/display/lweug/Wildcard+Queries, в которых упоминается производительность диких карт. На данный момент я не могу вспомнить, где я читаю, но где-то в Solr Wiki упоминается против использования поля: * в пользу *: * – Fuxi

+0

Итак, похоже, что поле: * равносильно запуску регулярного выражения для * на любой срок, найденный в поле. Мы в основном запрашиваем то, что знаем, что индекс Lucene не может дать нам быстрый ответ, заставляя его выполнять поверхностное сканирование терминов в поле. –

Смежные вопросы