Статьи

Три захватывающих сюжета Lucene за один день

Эта неделя была продуктивной. Внезапно в Lucene появилось три новых интересных функции.

Модуль выражений

Первой функцией, которая была добавлена ​​на этой неделе, является новый модуль выражений . Это позволяет вам определить динамическое поле для сортировки, используя произвольное Stringвыражение. Есть встроенная поддержка парсинга JavaScript , но парсер подключаемый, если вы хотите создать свой собственный синтаксис.

Например, если вы хотите предложить смешанную сортировку в первую очередь по релевантности и увеличению по полю популярности, вы можете определить поле сортировки, используя следующее выражение:

 sqrt(_score) + ln(popularity)

Код очень прост в использовании; Есть несколько хороших примеров в
TestDemoExpressions.javaмодульном тесте, который будет доступен в следующей стабильной версии Lucene (4.6).

Обновляемые поля числовых значений документа

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

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

В совокупности эти две функции обеспечивают мощные сценарии использования, в которых вы хотите сортировать по смешанному полю, которое меняется со временем. Например, возможно, вы измеряете, как часто пользователи нажимают на каждый документ в результатах поиска, а затем используете его для обновления
popularityполя, которое затем используется для смешанной сортировки. Таким образом, ранжирование результатов поиска меняется со временем, когда вы узнаете от пользователей, какие документы популярны, а какие нет.

Конечно, такая возможность всегда была возможна до использования пользовательского внешнего кода, но теперь, когда доступны как выражения, так и обновляемые значения документа, реализовать ее становится тривиально!

Свободные текстовые предложения

Наконец, третья функция — это новая реализация подсказок
FreeTextSuggester. Это совсем другое предложение, чем существующие; вместо того, чтобы предлагать из конечного множества заранее составленных предложений, он использует простую
модель языка ngram для прогнозирования «длинного хвоста» возможных предложений на основе одного или двух предыдущих токенов.

Под капотом он использует
ShingleFilterдля создания ngram и FST для хранения и поиска полученных моделей ngram. Хотя несколько моделей Ngram хранятся компактно в одном FST, FST все еще может быть довольно большим; 3-граммовая, 2-граммовая и 1-граммовая модель, построенная на
журналах запросов AOL, составляет 19,4 МБ (сами запросы — 25,4 МБ). Это было вдохновлено
подходом Google .

Вероятно, этот советчик будет использоваться не сам по себе, а скорее как запасной вариант, когда ваш основной советник не смог найти никаких предложений; Вы можете увидеть это поведение с
Google, Попробуйте выполнить поиск «быстро и», и вы увидите, что предложения по-прежнему полны запросов. Однако если следующее слово, которое вы вводите, — «прожиг», то внезапно Google (пока!) Не имеет полного предложения и возвращается к свободному текстовому подходу.