У меня есть рабочий индекс 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
Пожалуйста, помогите, если думаете, что вы :)