Оптимизация Solr для сортировки - PullRequest
5 голосов
/ 22 февраля 2011

Я использую Solr для поискового индекса в реальном времени.Мой набор данных составляет около 60 миллионов больших документов.Вместо сортировки по релевантности мне нужно отсортировать по времени.В настоящее время я использую флаг сортировки в запросе для сортировки по времени.Это хорошо работает для определенных поисков, но когда поиски возвращают большое количество результатов, Solr должен взять все полученные документы и отсортировать их по времени перед возвратом.Это медленно, и должен быть лучший способ.

Какой способ лучше?

Ответы [ 3 ]

4 голосов
/ 02 апреля 2011

Я нашел ответ.

Если вы хотите отсортировать по времени, а не по релевантности, используйте fq = вместо q = для всех ваших фильтров.Таким образом, Solr не тратит время на выяснение взвешенного значения документов, соответствующих q =.Оказывается, Solr тратит слишком много времени на взвешивание, а не на сортировку.

Кроме того, вы можете ускорить сортировку, предварительно согрев поля сортировки в слушателях событий newSearcher и firstSearcher в solrconfig.xml.Это обеспечит выполнение сортировки через кеш.

1 голос
/ 22 февраля 2011

Очевидный первый вопрос: какой тип вашего поля времени?Если это строка, то сортировка, очевидно, очень медленная.tdate даже быстрее, чем date.

Еще один момент: у вас достаточно памяти для Solr?Если он начинает меняться, то производительность сразу же ужасна.

И третий: если у вас более старая Lucene, то date - это просто строка, которая очень медленная.

0 голосов
/ 23 февраля 2011

Предупреждение : дикий совет, не основанный на предыдущем опыте или известных фактах.:)

  1. Выполните запрос без сортировки и строк = 0, чтобы получить количество совпадений.Отключите фасетирование и т. Д. Для повышения производительности - нам нужно только общее количество совпадений.
  2. На основе количества совпадений, полученных на шаге 1, распределения ваших данных и количества / смещения результатов, которые вам нужнызапустить другой запрос, который сортирует по дате, а также добавляет фильтр по дате, например fq=date:[NOW()-xDAY TO *], где x - приблизительный период времени в днях, в течение которого мы найдем необходимое количество подходящих документов.
  3. Если количество результатов из шага № 2 меньше требуемого, затем немного ослабьте фильтр и выполните другой запрос.

Для начала вы можете использовать следующее для оценки x:

Если вы равномерно добавляете n документов в день к индексу размером N документов и конкретному запросу соответствует d документов на шаге № 1, то для получения верхнего r результаты, которые вы можете использовать x = (N*r*1.2)/(d*n).Если вам нужно слишком часто ослаблять фильтр на шаге № 3, медленно увеличивайте значение 1,2 в формуле по мере необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...