Как работает Lucene - PullRequest
       13

Как работает Lucene

83 голосов
/ 24 апреля 2010

Я хотел бы узнать, как поиск lucene работает так быстро. Я не могу найти какие-либо полезные документы в Интернете. Если вам есть что почитать (кроме исходного кода lucene), дайте мне знать.

Запрос текстового поиска с использованием текстового поиска mysql5 с индексом в моем случае занимает около 18 минут. Поиск lucene по тому же запросу занимает менее секунды.

Ответы [ 4 ]

71 голосов
/ 24 апреля 2010

Lucene - это инвертированный полнотекстовый индекс. Это означает, что он берет все документы, разбивает их на слова, а затем создает индекс для каждого слова . Поскольку индекс является точным совпадением строк, неупорядоченным, он может быть очень быстрым. Гипотетически, неупорядоченный индекс SQL для поля varchar может быть таким же быстрым, и на самом деле, я думаю, вы обнаружите, что большие базы данных могут в этом случае очень быстро выполнить простой запрос на равенство строк.

Lucene не нужно оптимизировать для обработки транзакций. Когда вы добавляете документ, он не должен гарантировать, что запросы увидят его мгновенно . И его не нужно оптимизировать для обновления существующих документов.

Однако, в конце концов, если вы действительно хотите знать, вам нужно прочитать источник. В конце концов, обе вещи, на которые вы ссылаетесь, с открытым исходным кодом.

32 голосов
/ 07 мая 2013

Lucene создает большой индекс. Индекс содержит идентификатор слова, количество документов, в которых присутствует слово, и положение слова в этих документах. Поэтому, когда вы задаете запрос в одно слово, он просто ищет в индексе (O (1) сложность по времени). Затем результат ранжируется с использованием разных алгоритмов. Для многословных запросов достаточно взять пересечение множества файлов, в которых присутствуют слова. Таким образом, Lucene очень, очень быстрый.

Для получения дополнительной информации читайте эту статью от разработчиков Google - http://infolab.stanford.edu/~backrub/google.html

18 голосов
/ 24 апреля 2010

Одним словом: индексация.

Lucene создает индекс вашего документа, который позволяет выполнять поиск намного быстрее.

Это та же разница между структурой данных списка O (N) и структурой данных хеш-таблицы O (1). Список должен пройти через всю коллекцию, чтобы найти то, что вы хотите. Хэш-таблица имеет индекс, который позволяет ей точно определить, где находится нужный элемент, и просто получить его.

Обновление:

Я не уверен, что вы подразумеваете под "поиском по индексу Lucene намного быстрее, чем поиском по индексу mysql".

Я предполагаю, что вы используете MySQL "WHERE document LIKE"% фразу% "" для поиска документа. Если это правда, то MySQL должен выполнить сканирование таблицы в каждой строке, которая будет O (N).

Lucene получает возможность разбирать документ на токены, группировать их в n-граммы в вашем направлении и вычислять индексы для каждого из них. Это O (1), чтобы найти слово в проиндексированном документе Lucene.

4 голосов
/ 27 июня 2018

Lucene работает с Частота термина и частота инверсного документа . Он создает индекс, отображающий каждое слово в документе, и его счетчик частоты является ничем иным, как обратным индексом в документе.

Пример :

Файл 1: Оперативная память - это основная память.

Файл 2: Жесткие диски являются вторичной памятью.

Lucene создает обратный индекс, например,

Файл 1:

Срок: Случайный

Частота: 1

Позиция: 0

Термин: Память

Частота: 2

Позиция: 3

Позиция: 6

Так что он может быстро искать и получать искомый контент. Если для поискового запроса слишком много совпадений, он выводит результат на основе веса. Рассмотрим поисковый запрос «Основное запоминающее устройство» , он ищет все 4 слова по отдельности, и результат будет похож на

Main

Файл 1: Частота - 1

Память

Файл 1: Частота - 2

Файл 2: Частота - 1

Результат будет Файл1 , за которым следует Файл2 . Чтобы перестать увлекаться весами для наиболее распространенных слов, таких как «и», «или», «он считает частоту обратного документа (т. Е.« Он уменьшает вес слова, которое наиболее популярно среди набора документов »).

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