Многоязычный поиск с использованием Lucene - PullRequest
7 голосов
/ 02 сентября 2011

Я делаю многоязычный поиск. И я буду использовать lucene в качестве инструмента для этого.

У меня уже есть переведенное содержимое, для каждого документа будет 3 или 4 языка.

Для индексации и поиска могут быть 4 стратегии. Для каждого документа / содержания:

  1. каждый язык индексируется в отдельном индексе / каталоге.
  2. каждый язык индексируется в разных документах, но в одном и том же индексе.
  3. каждый язык индексируется в отдельном поле, но в одном и том же документе.
  4. все языки индексируются в одном и том же поле в документе

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

Спасибо!

Ответы [ 2 ]

2 голосов
/ 05 января 2016

Хотя вопрос был задан пару лет назад, это все же отличный вопрос.

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

  1. используются ли языковые анализаторы во время индексации?
  2. всегда ли известен язык запросов (например, выбираемый пользователем)?
  3. всегда ли язык запросов соответствует одному из языков "контента"?
  4. должен быть перенастроен только контент, соответствующий языку запроса?
  5. важна ли актуальность?

Если (1.) и (5.) действительны в вашем проекте, вы не должны рассматривать какую-либо стратегию, которая (повторно) использует одно и то же поле для нескольких языков в одном и том же инвертированном индексе, поскольку термины частоты для различных языков все смешалось (независимо от того, индексируете ли вы многоязычный контент как один документ или как несколько документов). Может быть интересно знать, что добавление полей, специфичных для языка «n», не приводит к увеличению индекса в n раз, но по понятным причинам это приводит к некоторым издержкам.


Одно поле (Стратегии 2 и 4)


+ only one field to query
+ scales well for additional languages
+ can distinguish/filter languages (if multiple documents, and extra language field)
- cannot distinguish/filter languages (if single document)
- cannot just display the queried language (if single document)
- "wrong" term frequencies (as all languages mixed up)

Несколько полей (Стратегия 3)


+ correct term frequencies
+ can easily restrict/filter queries for particular language(s)
+ facilitates Auto-Complete & Spellcheck / Did-You-Mean
- more fields to index
- more fields to query

Несколько индексов (Стратегия 1)


+ correct term frequencies
+ can easily restrict/filter queries for particular language(s)
+ facilitates Auto-Complete & Spellcheck / Did-You-Mean
- additional languages requires all their own index

Независимо от подхода с одним или несколькими полями, вашему решению может потребоваться обработка свертывания результатов для совпадений на «неправильном» языке, если вы индексируете свой контент как несколько документов. Одним из подходов может быть добавление языкового поля и фильтра для этого.

Рекомендация: Подход / стратегия, которую вы выбираете, зависит от требований проекта. Когда бы ни было возможно, я бы выбрал подход с несколькими полями или несколькими индексами.

1 голос
/ 02 сентября 2011

Короче говоря, это зависит от ваших потребностей, но я бы выбрал вариант 3 или 1.

1) было бы, вероятно, лучшим способом, если бы между языками вообще не было полей перекрытия / общего доступа.

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

Я бы не рекомендовал 2): это делает ваши поисковые запросы более сложными и заставляет lucene рассмотреть больше документов.

4) сделает ваш поисковый запрос очень сложным, если только вы не хотите, чтобы пользователи могли выполнять поискна любом языке без предварительного выбора.

...