(HibernateSearch) MultiFieldQueryParser 每个字段不同的分析器

发布于 2024-10-11 17:52:17 字数 129 浏览 2 评论 0原文

我的一些索引字段使用希腊语分析器,我想对其他一些字段使用英语分析器。我的问题是:搜索结果时(当前使用 MultiFieldQueryParser),如何为每个字段使用不同的分析器,以便希腊语分析器用于希腊语索引字段,英语分析器用于英语索引字段?

Some of my indexed fields use a Greek analyzer and I want to use an English analyzer for some other fields. My problem is: When searching for results (with a MultiFieldQueryParser currently), how can I use a different analyzer per field, so that a Greek analyzer is used for Greek-indexed fields and an English analyzer is used for English-indexed fields?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

嗫嚅 2024-10-18 17:52:17

这是我找到的解决方案。请评论。

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;

Here is the solution I found. Please comment.

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;
羁绊已千年 2024-10-18 17:52:17

您可以像这样构建查询解析器:

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(){
 //...
}

You could build your query parser like this:

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

which would use the proper analyzer, as defined in the annotations of your Item class:

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

@Field(name = "englishTitle" analyzer = @Analyzer(impl = StandardAnalyzer.class))
public void getEnglishTitle(){
 //...
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文