将QueryDSL与Hibernate Search和Lucene相结合

时间:2016-06-30 17:20:40

标签: hibernate lucene querydsl hibernate-search

我使用Apache Lucene配置了Hibernate Search,以便通过给定的坐标更轻松地搜索enitites。现在我想知道如何为搜索实体添加更多标准。我也在使用Spring Data项目和Query DSL。我正在尝试使用QueryDSL中的Predicate类来保持我的应用程序一致。这有可能吗?

我的Place.class

@Getter
@Setter
@Entity
@Indexed
@Spatial
public class Place implements Serializable {

    private static final long serialVersionUID = -8379536848917838560L;
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Id
    @Column(name = "place_id")
    private Long id;

    //...
    @Longitude
    private Double lng;

    @Latitude
    private Double lat;
    //...
    }

我的存储库类

@PersistenceContext(type = PersistenceContextType.EXTENDED)
EntityManager em;

@Override
@Transactional
public List findAll(Coordinates coordinates, Predicate predicate, Pageable pageable, int maxDistance) {

    FullTextEntityManager fullTextSession = Search.getFullTextEntityManager(em);

    QueryBuilder builder = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Place.class).get();

    org.apache.lucene.search.Query luceneQuery = builder
            .spatial()
            .within(maxDistance, Unit.KM)
            .ofCoordinates(coordinates)
            .createQuery();

    FullTextQuery jpaQuery = fullTextSession.createFullTextQuery(luceneQuery, Place.class);
    return jpaQuery.getResultList();
}

1 个答案:

答案 0 :(得分:1)

我假设您没有要求将多个全文查询与布尔查询相结合 - 因为我希望文档有足够的示例 - 但是您要求添加基于SQL的限制。

在实践中,可以通过应用FullTextQuery进一步限制Criteria,但是虽然这似乎有效,但这个功能并非故意(这背后的有趣故事!),测试不佳,根本没有效率:尽可能避免。它没有删除,因为有些人真的喜欢它。

您可以在示例“5.12。在查询中指定FetchMode”中找到示例 - 以及有关限制的警告 - :   - http://docs.jboss.org/hibernate/search/5.6/reference/en-US/html_single/

更好的解决方案是通过仅限制索引字段来运行全文查询,以便Lucene只能完全解析查询。

有时,在索引中对其他字段进行编码会有所帮助,以某种方式“预先标记”要匹配的Lucene文档。这是人们需要有点创意的地方,您可以编写一些自定义的FieldBridgeClassBridge实现。

然后应用Full-Text Filter,或将多个查询与布尔查询结合使用:请参阅“5.1.2.8。组合查询”一节。