2013-10-28 2 views
1

Я пробовал много анализаторов lucene и нашел, что анализатор ключевых слов является лучшим для моего требования. Я использую тот же анализатор ключевых слов как для обновления документа, так и для поиска с использованием QueryParser. Я хочу найти значения с поддержкой подстановочных знаков. Например: если поле «страна» содержит значение «india» Я могу найти то же поле, что и «ind *», «ndi», india и т. Д. Я получаю соответствие для всех других запросов, кроме точное совпадение. т.е. когда я ищу точное слово (страна: Индия), я не получаю никакого соответствия. Если я изменяю тот же запрос, что и «страна: india *» или «страна: indi?», Я получаю матч . Также у меня есть еще одно сомнение, если есть страна с именем «нет», как я могу искать то же самое. Я попробовал «страна:» не «» и «страна: \ нет». Но оба потерпели неудачу. Что происходит в обоих случаях? Пожалуйста, помогите.Lucene Analyzer для простого прямого поиска поля

ответ

1

Я подозреваю, что у вас есть пробелы или другие посторонние символы после названия страны. Вы можете либо урезать свой вклад, прежде чем добавить в Lucene, или реализовать анализатор пользовательских ключевых слов, и добавить TrimFilter, что-то вроде:

public final class CustomKeywordAnalyzer extends Analyzer { 
    public CustomKeywordAnalyzer() { 
    } 

    @Override 
    protected TokenStreamComponents createComponents(final String fieldName, final Reader reader) { 
    Tokenizer tokenizer = new KeywordTokenizer(reader) 
    TokenStream filter = new TrimFilter(Version.LUCENE_43, tokenizer); 
    return new TokenStreamComponents(tokenizer, filter); 
    } 
} 

Что касается поиска «нет», это просто быть в нижнем регистре должны быть адекватными поскольку он не должен интерпретироваться как логический оператор (AND, OR и NOT, операторы должны быть прописными, за the documentation). Эти слова поймают стандартный английский StopFilter, хотя, например, тот, который используется StandardAnalyzer. Вы действительно используете KeywordAnalyzer при запросе?

Запрещая что, однако, верный способ избежать парсер запросов зарезервированных слов было бы просто обойти анализатор запросов полностью, и построить в запросе себя:

Query query = new TermQuery(new Term("country", userQuery)); 
+0

Спасибо за ценный ответ. Хотя это не полностью решает мою проблему. Это помогло мне многому понять многие вещи, чтобы я мог решить все остальное сам. :) –

Смежные вопросы