结合hibernate全文搜索和JPA查询

Posted

技术标签:

【中文标题】结合hibernate全文搜索和JPA查询【英文标题】:Combine hibernate full text search and JPA query 【发布时间】:2015-02-09 03:36:20 【问题描述】:

我最近熟悉了 Hibernate 搜索 API。如何对实体进行全文搜索并按特定字段过滤结果?例如:

final FullTextEntityManager ftem = Search.getFullTextEntityManager(em);

final QueryBuilder qb = ftem.getSearchFactory()
        .buildQueryBuilder().forEntity(Item.class).get();

final org.apache.lucene.search.Query query = qb
        .keyword()
        .onFields(Item_.CONTENT)
        .matching(match)
        .createQuery();

/* also here I want to filter the results for all the Items in which category equals to 2 */

final FullTextQuery persistenceQuery = ftem.createFullTextQuery(query, Item.class);

final List<Item> result = persistenceQuery.getResultList();

【问题讨论】:

我也有同样的问题!不幸的是,我还没有发现任何有用的东西。如果您找到解决方案,也请分享答案。 【参考方案1】:

对于这种情况,您可以使用 Hibernate-search Filters。您还需要索引过滤所需的特定字段,但查询本身不需要它。

http://docs.jboss.org/hibernate/search/5.5/reference/en-US/html/ch05.html#query-filter

我自己用它,效果很好。

【讨论】:

感谢您的回答。但我不知道索引例如 userId 字段并对其应用过滤器是否正确!!就像我可能有 20,000,000 条记录,其中 1,000,000 条具有相同的 userId。在 userId 上创建过滤器是否足够快? 我不确定这是否真的有问题。如果您对该领域使用一些简单的分析器。如果您想在 SQL DB 中过滤该字段,您可能还会对该字段使用一些索引。

以上是关于结合hibernate全文搜索和JPA查询的主要内容,如果未能解决你的问题,请参考以下文章

使用 JPA (Eclipselink) 在 H2 数据库中执行全文搜索

如何明智地结合 shingles 和 edgeNgram 来提供灵活的全文搜索?

使用 hibernate 按 userId 字段过滤全文搜索结果

Mysql+Sphinx实现全文搜索

全文搜索引擎有那些、

Elasticsearch:深入理解 Elasticsearch 查询:过滤器查询 vs 全文搜索