我使用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();
}
答案 0 :(得分:1)
我假设您没有要求将多个全文查询与布尔查询相结合 - 因为我希望文档有足够的示例 - 但是您要求添加基于SQL的限制。
在实践中,可以通过应用FullTextQuery
进一步限制Criteria
,但是虽然这似乎有效,但这个功能并非故意(这背后的有趣故事!),测试不佳,根本没有效率:尽可能避免。它没有删除,因为有些人真的喜欢它。
您可以在示例“5.12。在查询中指定FetchMode”中找到示例 - 以及有关限制的警告 - : - http://docs.jboss.org/hibernate/search/5.6/reference/en-US/html_single/
更好的解决方案是通过仅限制索引字段来运行全文查询,以便Lucene只能完全解析查询。
有时,在索引中对其他字段进行编码会有所帮助,以某种方式“预先标记”要匹配的Lucene文档。这是人们需要有点创意的地方,您可以编写一些自定义的FieldBridge
和ClassBridge
实现。
然后应用Full-Text Filter,或将多个查询与布尔查询结合使用:请参阅“5.1.2.8。组合查询”一节。