Hibernate Search ShingleAnalyzerWrapper рабочий пример - PullRequest
1 голос
/ 10 марта 2011

Я использую 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()));

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

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

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

Ответы [ 2 ]

2 голосов
/ 30 июня 2011

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

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

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

Никита

1 голос
/ 06 июля 2011

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

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

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

...