Многоязычный анализатор Lucene / индексный подход - PullRequest
2 голосов
/ 03 апреля 2012

У меня есть рабочий индекс Lucene, поддерживающий сервис предложений.Когда пользователь вводит в поле поиска, он запрашивает индекс с помощью SUGGESTION_FIELD.Каждая запись в SUGGESTION_FIELD может быть одним из многих поддерживаемых языков, и каждая из них хранится с использованием соответствующего языкового анализатора.Чтобы узнать, какой анализатор использовался, в каждой записи есть второе поле, в котором хранится LOCALE.Поэтому во время запроса я могу сказать что-то вроде приведенного ниже кода, чтобы выполнить запрос для конкретного языка, используя соответствующий анализатор

QueryParser parser = new QueryParser(Version.LUCENE_33, SUGGESTION_FIELD, getLangaugeAnalyzer(locale));
return searcher.search(parser.parse("SUGGESTION_FIELD:" + queryString + " AND LOCALE:"
                + locale), 100);

Работает .... Но теперь клиент хочет иметь возможность поиска с использованием нескольких языков наодин раз.

Мой вопрос: Каким было бы самое быстрое решение для запросов, учитывая, что служба предложений должна быть очень быстрой? ...

Sol.# 1.Казалось бы, самое простое решение;сделать запрос несколько раз.Один раз для каждой локали, тем самым каждый раз применяя соответствующий анализатор языка.Наконец добавьте результаты каждого запроса некоторым разумным способом

Sol.# 2.В качестве альтернативы я мог бы переиндексировать, используя столбец для каждой локали, например:

SUGGESTION_FIELD_en, SUGGESTION_FIELD_fr, SUGGESTION_FIELD_es etc.. 

, используя разные анализаторы для каждого поля (используя PerFieldAnalyzerWrapper), а затем выполнить запрос, используя более сложную строку запроса, такую ​​как:

"SUGGESTION_FIELD_en:" + queryString + " AND SUGGESTION_FIELD_fr:" + queryString + " AND SUGGESTION_FIELD_es:" + queryString

Пожалуйста, помогите, если вы думаете, что:)

1 Ответ

1 голос
/ 04 апреля 2012

Ваш запрос будет примерно таким:= ДОЛЖЕН, где каждый подчиненный запрос имеет свои условия с = ДОЛЖЕН.QueryString1, queryString2 и т. Д. Являются выходными данными различных анализаторов языка, имеющих одинаковые входные данные и строку, введенную пользователем.

Каждый подчиненный запрос включает обязательные термины (из строки запроса), которые встречаются редко в индексе иLucene знает об этом с самого начала (он знает общее количество документов для каждого Term в индексе), поэтому сначала он ограничит результат с помощью queryString, а затем дополнительно пересечет его с терминами локали.Это будет ОЧЕНЬ эффективно независимо от того, насколько велик ваш индекс.

Что касается различных анализаторов, я предлагаю вам не использовать QueryParser, а создавать весь запрос программно.Это хороший общий совет, когда вы не вводите запрос вручную, и в вашем случае это единственный способ получить контроль над аспектом анализа.Проведите строку запроса через каждый из анализаторов языка и добавьте их выходные токены как TermQueries в подчиненный BooleanQueries.

...