(HibernateSearch) MultiFieldQueryParser другой анализатор для каждого поля - PullRequest
3 голосов
/ 09 января 2011

Некоторые из моих проиндексированных полей используют греческий анализатор, и я хочу использовать английский анализатор для некоторых других полей.Моя проблема: при поиске результатов (в настоящее время с MultiFieldQueryParser), как я могу использовать другой анализатор для каждого поля, чтобы греческий анализатор использовался для полей, проиндексированных на греческом языке, а английский анализатор использовался для полей, проиндексированных на английском языке?1001 *

Ответы [ 2 ]

1 голос
/ 10 января 2011

Вот решение, которое я нашел.Пожалуйста, прокомментируйте.

transaction.begin();

PerFieldAnalyzerWrapper wrapper = new PerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_30));

wrapper.addAnalyzer("greekTitle", new GreekAnalyzer(Version.LUCENE_30));
wrapper.addAnalyzer("greekDescription", new GreekAnalyzer(Version.LUCENE_30));

String[] fields = {"greekTitle", "greekDescription", "englishTitle", "englishDescription"};

QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_30, fields, wrapper);
queryParser.setDefaultOperator(QueryParser.AND_OPERATOR);
org.apache.lucene.search.Query query = queryParser.parse(QueryParser.escape(queryString));

javax.persistence.Query persistenceQuery = 
fullTextEntityManager.createFullTextQuery(query, Item.class);

@SuppressWarnings("unchecked")
List<Item> result = persistenceQuery.getResultList();

transaction.commit();

return result;
0 голосов
/ 29 августа 2012

Вы можете создать свой анализатор запросов следующим образом:

Analyzer analyzer = fullTextSession.getSearchFactory().getAnalyzer(Item.class);
QueryParser parser = new MultiFieldQueryParser(Version.LUCENE_31, fields, analyzer);

, который будет использовать соответствующий анализатор, как определено в аннотациях вашего класса Item:

@Field(name = "greekTitle" analyzer = @Analyzer(impl = GreekAnalyzer.class))
public void getGreekTitle(){
 //...
}

@Field(name = "englishTitle" analyzer = @Analyzer(impl = StandardAnalyzer.class))
public void getEnglishTitle(){
 //...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...