Solr * vs *: * производительность запросов - PullRequest
1 голос
/ 10 января 2012

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

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

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

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

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

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

1 Ответ

2 голосов
/ 10 января 2012

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

Solr / Lucene оптимизирован для быстрого и эффективного выполнения * : *!

...