Рабочий пример Hibernate Search ShingleAnalyzerWrapper

Я использую hibernate-search-3.2.1.Final и хочу проанализировать введенные мной данные в черепицу. Из того, что я вижу в документации, ShingleAnalyzerWrapper кажется именно тем, что мне нужно. Я тестировал как WhitespaceAnalyzer, StandardAnalyzer, так и SnowballAnalyzer в качестве анализатора по умолчанию для ShingleAnalyzerWrapper.

Version luceneVersion = Version.LUCENE_29;
SnowballAnalyzer keywordAnalyzer= new SnowballAnalyzer(luceneVersion, "English", StopAnalyzer.ENGLISH_STOP_WORDS_SET);
ShingleAnalyzerWrapper shingleAnalyzer = new ShingleAnalyzerWrapper(keywordAnalyzer, 4);
shingleAnalyzer.setOutputUnigrams(false);
QueryParser keywordParser = new QueryParser(luceneVersion, "keyword", keywordAnalyzer);
Query keywordQuery = keywordParser.parse(QueryParser.escape(keyword.toLowerCase()));

Однако запрос вернулся пустым. Я ожидал, что ключевое слово вроде "hello world, this is Lucene" приведет к черепице [привет, мир, это, мир, это люцен, это люцен]

Сообщите мне, верны ли мои ожидания и использование ShingleAnalyzerWrapper.

Спасибо, Райан


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


Ответы (2)


Возможно, это ошибка копирования / вставки, но в вашем фрагменте кода shingleAnalyzer на самом деле не используется, потому что вы передаете переменную keywordAnalyzer в синтаксический анализатор запросов. Какой анализатор вы используете во время индексации?

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

Хороший способ отладки анализаторов - использовать что-то вроде AnalyzerUtils, описанного в «Lucene в действии». Вы можете получить образец кода здесь: http://java.codefetch.com/example/in/LuceneInAction/src/lia/analysis/AnalyzerUtils.java.

Никита

person nikita    schedule 30.06.2011

Спасибо, Никита! Да, это была ошибка копирования и вставки, хотя правильная версия по-прежнему дает правильные результаты.

Ваша ссылка на AnalyzerUtils мне очень помогла, так как я смог использовать следующий код для создания черепицы:

ShingleAnalyzerWrapper shingleAnalyzer = new ShingleAnalyzerWrapper(4);
shingleAnalyzer.setOutputUnigrams(false);

TokenStream stream = shingleAnalyzer.tokenStream("contents", new StringReader("red dress shoes with black laces"));
ArrayList tokenList = new ArrayList();
while (true) {
    Token token = null;
    try {
        token = stream.next();
    } catch (IOException e) {
        e.printStackTrace();  
    }
    if (token == null) break;
        tokenList.add(token);
}

Что производит:

[(red dress,0,9,type=shingle), (red dress shoes,0,15,type=shingle,posIncr=0), (red dress shoes black,0,26,type=shingle,posIncr=0), (dress shoes,4,15,type=shingle), (dress shoes black,4,26,type=shingle,posIncr=0), (dress shoes black laces,4,32,type=shingle,posIncr=0), (shoes black,10,26,type=shingle), (shoes black laces,10,32,type=shingle,posIncr=0), (black laces,21,32,type=shingle)]

Проблема заключалась не в самом ShingleAnalyzerWrapper, а в QueryParser. Мне понадобится еще немного покопаться, чтобы выяснить, в чем основная причина, но вы дали мне кое-что, с чего начать.

person ltfishie    schedule 06.07.2011