Я пытаюсь выяснить, как фильтровать очень большой набор документов на основе соответствия ключевых слов.Альтернативы поиску программного обеспечения/серверов для получения идентификаторов для всех соответствующих документов
У меня есть 20 + миллионов записей с идентификатором и (несколькими) текстовыми полями в моей базе данных SQL, и я хочу получить все идентификаторы, для которых текст соответствует набору ключевых слов. Сюда относятся более сложные выражения, такие как:
(term1 NEAR term2 NEAR term3) AND NOT "A phrase" AND @fieldXYZ "wildcards%aswell*"
Результаты не обязательно должны оцениваться, сортироваться или оцениваться каким-либо образом.
Из того, что я понимаю, сила Lucene/Solr, Sphinx и ElasticSearch заключается в том, чтобы быстро вернуть документы TOP, но они на самом деле не предназначены для возврата ВСЕХ документов.
Я знаю, что это можно сделать с помощью пользовательского коллектора в Lucene (см. What's the most efficient way to retrieve all matching documents from a query in Lucene, unsorted?) и, возможно, с помощью курсоров/прокрутки в Solr/Elasticsearch, но мне интересно, есть ли какая-либо другая технология, специально оптимизированная для этой проблемы ?
Не может помочь реальный вопрос, но пока Sphinx не имеет явной поддержки «курсора», его довольно легко настроить с помощью доступных опций. Я смог получить порядка миллионов идентификаторов за 2-3 секунды для сложного запроса. – barryhunter
Не могли бы вы объяснить немного больше, как вы получаете это представление? Те тесты, которые я сделал с Sphinx, просто требуя с повышенным смещением LIMIT, на самом деле не являются удовлетворительными, потому что похоже, что он выполняет новый поиск каждый раз, хотя я остался под значением MAX_MATCHES. Разве он не должен хранить результаты в памяти? Также, если я увеличиваю MAX_MATCHES до значения, которое позволяет получить все соответствующие документы, запросы будут довольно медленными с точностью до 10 с (по очень базовому и неоптимизированному индексу). – dennis
Ну, идея НЕ делать с LIMIT. Как вы говорите, это ужасно неэффективно. Необходимо внедрить реальную систему курсора, используя фильтр, а не смещение/ограничение. Пример здесь: http://sphinxsearch.com/forum/view.html?id=7215 - но может выжать больше производительности, используя SphinxQL, и осторожное использование опции CUTOFF. (также может использовать распределенный индекс, который может использовать современные многоядерные процессоры) – barryhunter