在关系数据库中有一些规范化的表,而实际相关的数据存储在一个视图中,这个视图非常大(80列的大约1.2亿行)。 80个列中的大约10个与搜索问题相关,这些问题将使用hibernate search 4.3.2实现 对我来说似乎合乎逻辑,通过索引视图实体并仅查询80个所需列中的10个(@Field注释),我获得了大量冗余数据,这些数据仅由主键区分。
目前我做了以下事项:
ScrollableResults ids = fullTextSession.createCriteria(clazz)
.addOrder(Order.asc("id"))
.add(Restrictions.ilike(field, query))
.add(Projections.distinct(Projections.id()))
.setProjection((Projections.distinct(Projections.id())))
.scroll(ScrollMode.FORWARD_ONLY);
ArrayList<String> results = new ArrayList<String>();
while (ids.next()) {
ScrollableResults redundantResults = fullTextSession.createCriteria(clazz)
.add(Restrictions.idEq(ids.get(0)))
.setProjection(Projections.projectionList()
.add(Projections.property("name"))
.add(Projections.property("city"))
.add(Projections.property("postal"))
)
.scroll(ScrollMode.FORWARD_ONLY);
if (redundantResults.next())
results.add((String) redundantResults.get(0));
}
我知道我一定是错的,我的意图是:
1.获取一组不同的对象,符合我的搜索条件
2.仅使用lucene索引获取它们,因为DB查询太昂贵了
虽然获取不同的ID的步骤似乎在性能上非常好,但从文档中获取属性数据的第二步却非常慢。在我看来,在这两个步骤中都没有对DB进行查询,这符合我的意图 我认为投影是处理lucene索引并避免对数据库进行hibernate查询的唯一方法,或者我错了吗?
我很感激如何获得更好的搜索性能。