hibernate在lucene索引上搜索4个不同的结果

时间:2016-02-07 00:10:13

标签: java hibernate lucene hibernate-search

在关系数据库中有一些规范化的表,而实际相关的数据存储在一个视图中,这个视图非常大(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查询的唯一方法,或者我错了吗?

我很感激如何获得更好的搜索性能。

0 个答案:

没有答案