Як діє Люцен


90

Я хотів би з’ясувати, як так швидко працює пошук люцену. Я не можу знайти жодної корисної документації в Інтернеті. Якщо вам є що прочитати (не вистачає вихідного коду люцену), дайте мені знати.

Запит на пошук тексту за допомогою пошуку тексту mysql5 з індексом у моєму випадку займає близько 18 хвилин. Пошук люцену для того самого запиту займає менше секунди.


2
Чи можу я попросити це питання перетворити на вікі спільноти? Люцен зараз звучить як платформа.
asyncwait 03.03.14

Відповіді:


75

Люцен - це перевернутий повнотекстовий індекс. Це означає, що він бере всі документи, розбиває їх на слова, а потім будує індекс для кожного слова . Оскільки індекс є точним збігом рядків, невпорядкованим, він може бути надзвичайно швидким. Гіпотетично, невпорядкований індекс SQL наvarchar полі може бути настільки ж швидким, і насправді, я думаю, ви знайдете, що великі бази даних можуть дуже швидко зробити простий запит про рівність рядків у такому випадку.

Люцен не повинен оптимізувати для обробки транзакцій. Коли ви додаєте документ, йому не потрібно гарантувати, що запити бачать його миттєво . І не потрібно оптимізувати оновлення існуючих документів.

Однак наприкінці дня, якщо ви дійсно хочете знати, вам потрібно прочитати джерело. Зрештою, обидві речі, на які ви посилаєтесь, є відкритими.


Якщо я правильно розумію, вирізняє текстові пошукові системи те, як вони обробляють пошук за кількома словами та об’єднують результати пошуку в декілька індексів у режимі реального часу. Я не радив би проконсультуватися з цим питанням у джерела Lucene. Можливо, було б краще прочитати трохи про теорію пошуку тексту, мені допомогла відповідь @ alienCoder.
Кріс Датроу,

1
@bmargulies, якщо індексація «за слово», то чому StackOverflow пошуку користувачів stackoverflow.com/users дозволяють подстроки?
Pacerier

2
Тут не місце для цілих книг. Існує будь-яка кількість деталей розробки основної концепції.
bmargulies

Що ви маєте на увазі "індекс для кожного слова" ... якщо я почну вводити "abc", як це знайде "abc" у документі?
Олександр Міллс

1
Індекс (B-дерево) від слова до документа може шукати документи за словами в документі, оскільки таблиця такого індексу знаходиться (слово, документ), де індекс знаходиться у стовпці слів. Розглянемо такий запит: "Знайдіть документи, у яких є слова" міліція "," злочинність "," статистика ". Шукаючи в індексі слів, ви можете здійснити три пошукові записи в журналі (N), щоб отримати O (N) документи з одним із цих слів у них. Потім ви можете виконати дві петлі O (N), щоб створити набір, що містить документи, що містять усі три слова. Хоча це теоретично операція O (N), більшість документів не мають усіх трьох слів, тому її O (n) де n <N.
Calicoder

34

Люцен створює великий індекс. Індекс містить ідентифікатор слова, кількість документів, де це слово присутнє, і положення слова в цих документах. Отже, коли ви даєте запит одного слова, він просто шукає індекс (O (1) складність часу). Потім результат класифікується за допомогою різних алгоритмів. Для багатословного запиту просто візьміть перетин набору файлів, де присутні слова. Таким чином, Люцен дуже швидко.

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


8
Переглянувши цей папір, це було дуже корисно. Зокрема, "4.5 Пошук" мав відповідь, яку я шукав. Зокрема, це звучить так, як для окремих слів використовується пошук за хешем O (1), але потім використовується сканування O (n), щоб об’єднати результати з обмеженням в 40 000 документів. Я припускаю, що для розподілу цієї роботи використовується алгоритм зменшення карти, щоб користувач отримував миттєві результати.
Кріс Датроу,

Одним із популярних алгоритмів є алгоритм розряду голубів. Хоча я про це мало що знаю.
alienCoder

3
Ця стаття кумедна: "У цій статті ми представляємо Google, прототип ...". Думаю, Google не завжди була мегакорпорацією.
Buttons840

не знаю Люцена, але одне питання: рейтинг відбувається при кожному пошуку? Або він підтримує документи з попереднім ранжуванням? Якщо він підтримує документи за рангом заздалегідь, як він підтримує запит на кілька слів?
Вікас Прасад

Зараз посилання порушено. @alienCoder
CEGRD

20

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

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

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

Оновлення:

Я не впевнений, що ви маєте на увазі під "пошук індексу Lucene набагато швидший, ніж пошук за індексом MySQL".

Я припускаю, що ви використовуєте MySQL "WHERE document LIKE '% phrase%'" для пошуку документа. Якщо це правда, то MySQL повинен виконати сканування таблиці в кожному рядку, яке буде O (N).

Люцен отримує аналіз документа на маркери, згрупує їх у n-грами за вашим вказівкою та обчислює індекси для кожного з них. Це O (1) - знайти слово в індексованому документі Lucene.


10
Так, я розумію частину індексації, але знову ж таки, пошук за індексом люцену набагато швидший, ніж пошук за індексом MySQL. Як це відбувається
Мідхат

8

Люцен працює з частотою термінів та зворотною частотою документа . Він створює індекс, що відображає кожне слово з документом, і це підрахунок частоти, що є нічим іншим, як зворотним індексом у документі.

Приклад :

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

Файл 2: Жорсткі диски - це вторинна пам’ять.

Люцен створює зворотний індекс приблизно так

Файл 1:

Термін: Випадковий

Частота: 1

Позиція: 0

Термін: Пам’ять

Частота: 2

Позиція: 3

Позиція: 6

Таким чином, він може швидко шукати та отримувати вміст, що шукається. Коли для пошукового запиту занадто багато збігів, він виводить результат на основі ваги. Розгляньте пошуковий запит "Основна пам'ять", він шукає всі 4 слова окремо, і результат буде таким,

Головна

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

Пам'ять

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

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

Результатом буде Файл1, а потім Файл2 . Щоб перестати захоплюватися вагами на найпоширеніших словах, таких як 'та', 'або', ',' він враховує зворотну частоту документа (тобто 'це зменшує вагу слова, яке є найбільш популярним серед набору документів).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.