Индексирование многоязычных слов в lucene

Я пытаюсь проиндексировать в Lucene поле, которое может иметь литерал RDF на разных языках. Большинство подходов, которые я видел до сих пор:

  • Используйте единый индекс, где в каждом документе есть поле для каждого используемого языка, или

  • Используйте M индексов, где M — количество языков в корпусе.

В Lucene 2.9+ есть функция Payload, которая позволяет прикреплять атрибуты к термину. Кто-нибудь использует этот механизм для хранения информации о языке (или других атрибутах, таких как типы данных)? Какова производительность по сравнению с двумя другими подходами? Любой указатель на исходный код, показывающий, как это делается, поможет. Спасибо.


person fellahst    schedule 10.03.2011    source источник


Ответы (2)


По-разному.

  1. Вы хотите разрешить что-то вроде: «Искать во всем английском тексте «foo»»? Если да, то вам понадобится одно поле для каждого языка.
  2. Или вы хотите «Искать во всем тексте «foo» и указать пользователю, на каком языке было найдено совпадение?» Если это то, что вы хотите, то будут работать либо полезные данные, либо отдельные поля.
  3. Альтернативный способ сделать это — проиндексировать весь текст в одном поле, а в другом поле указать язык документа. (Предположим, что каждый документ написан на одном языке.) Тогда ваш поиск будет выглядеть примерно так: +text:foo +language:english.

С точки зрения эффективности: вы, вероятно, захотите избежать полезной нагрузки, поскольку вам придется повторять название языка для каждого термина, и вы не можете выполнять поиск на основе полезной нагрузки (по крайней мере, нелегко).

person Xodarap    schedule 10.03.2011
comment
Я хочу случай 2. Мне нужно иметь возможность представить пользователю язык своего литерала. Если поле с именем prefLabel, может ли lucene обрабатывать индексирование метки, одинаковой на разных языках, например, email^en email^fr? Использует ли инвертированный индекс полезную нагрузку для различения записи? - person fellahst; 10.03.2011
comment
@fellahst: Вы можете думать о полезной нагрузке как о любом случайном дерьме, которое вы хотите прикрепить к термину. Поисковик игнорирует. Вы можете вручную вытащить его в конце, хотя. - person Xodarap; 11.03.2011
comment
Я заметил, что есть класс PayloadTermQuery, который позволяет запрашивать Payload. Я не уверен, правильно ли вы утверждаете, когда говорите, что поисковик игнорирует полезную нагрузку. - person fellahst; 11.03.2011
comment
@fellahst: Достаточно честно, вы можете создать свой собственный PayloadFunction. Но это не встроено в Lucene; полезные нагрузки не индексируются так же, как термины. Если вас беспокоит производительность, полезные нагрузки — не лучший вариант. - person Xodarap; 11.03.2011

так что в основном lucene - это алгоритм ранжирования, он просто просматривает строки и сравнивает их с другой строкой. они могут быть закодированы в разных кодировках символов, но их сходство не меньше. Просто убедитесь, что вы загружаете SnowBallAnalyzer с помощью поддерживаемого языкового стеммера, и вы должны получить результаты. Например, испанский или китайский

person Krolique    schedule 11.03.2011