Мы запускаем 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% документов).
Что может быть причиной этого? Есть ли что-нибудь, что мы можем настроить?
Почему так много медленнее, чем поиск любого другого общего слова? 'text: foo' невероятно быстро по сравнению с' text: * ', независимо от того, сколько документов согласовано с foo. Разумеется, поиск поля: * должен быть в состоянии отказаться от любого фактического соответствия по содержимому поля, если он существует? –
Потому что * соответствует всем, и это дорого. Я не так много знаю о Lucene, но считаю, что поиск терминов заключается в использовании более оптимизированных данных, а затем при поиске * в каждом значении поля. Пожалуйста, прочитайте: http://lucidworks.lucidimagination.com/display/lweug/Wildcard+Queries, в которых упоминается производительность диких карт. На данный момент я не могу вспомнить, где я читаю, но где-то в Solr Wiki упоминается против использования поля: * в пользу *: * – Fuxi
Итак, похоже, что поле: * равносильно запуску регулярного выражения для * на любой срок, найденный в поле. Мы в основном запрашиваем то, что знаем, что индекс Lucene не может дать нам быстрый ответ, заставляя его выполнять поверхностное сканирование терминов в поле. –