我是休眠搜索的新手,并且有此问题,我想在休眠搜索中使用名字,中间名,姓氏,用户名以及合作伙伴ID来搜索特定合作社中的成员,搜索返回的成员与任何搜索字词,而不考虑合作社ID。

非常感谢您为上述问题提供的帮助,我仍然是休眠搜索的新手,这确实需要我的时间。

请参见下面的代码示例:

public List<MemberProfile> searchForMember(String memberSearchTerm, int cooperativeId, int pageNumber, int pageSize) throws Exception {
        HibernateDataAccess dao = new HibernateDataAccess();
        List<MemberProfile> members = new ArrayList<>();
        try {
            dao.startOperation();

            Cooperative cooperative = (Cooperative) dao.searchObject(Cooperative.class, cooperativeId);

            FullTextSession fullTextSession = Search.getFullTextSession(dao.getSession());
            QueryBuilder qb = fullTextSession.getSearchFactory()
                    .buildQueryBuilder().forEntity(MemberProfile.class).get();

            org.apache.lucene.search.Query cooperativeQuery = qb
                    .keyword()
                    .onField("cooperative.cooperativeName")
                    .matching(cooperative.getCooperativeName())
                    .createQuery();

            org.apache.lucene.search.Query memberQuery = qb
                    .keyword()
                    .onFields("username", "firstName", "middleName",
                            "lastName", "phoneNumber", "emailAddress")
                    .matching(memberSearchTerm)
                    .createQuery();

            org.apache.lucene.search.Query luceneQuery = qb.bool()
                    .must(cooperativeQuery)
                    .must(memberQuery)
                    .createQuery();

            Query query = fullTextSession.createFullTextQuery(luceneQuery, MemberProfile.class)
                    .setFirstResult((pageNumber - 1) * pageSize)
                    .setMaxResults(pageSize);
            members = query.getResultList();

            dao.commit();
        } catch (Exception ex) {
            dao.rollback();
            logger.error("error thrown - ", ex);
            throw new Exception(ex);
        } finally {
            dao.closeSession();
        }
        return members;
    }

最佳答案

该查询似乎正确。我最好的猜测是,合作社名称中有一些常用词(例如“ coop”或“ cooperative”),而对合作社名称的查询最终匹配了许多不同的合作社。

由于您将ID作为输入,因此最好直接在合作ID上运行查询。

首先,请确保在您的@IndexedEmbedded中包含合作社ID:

public class MemberProfile {

   // ...

   @ManyToOne
   @IndexedEmbedded(includeEmbeddedObjectId = true) // Change this
   private Cooperative cooperative;

   // ...

}


然后重新索引您的数据。

然后更改代码的这一部分:

            Cooperative cooperative = (Cooperative) dao.searchObject(Cooperative.class, cooperativeId);

            FullTextSession fullTextSession = Search.getFullTextSession(dao.getSession());
            QueryBuilder qb = fullTextSession.getSearchFactory()
                    .buildQueryBuilder().forEntity(MemberProfile.class).get();

            org.apache.lucene.search.Query cooperativeQuery = qb
                    .keyword()
                    .onField("cooperative.cooperativeName")
                    .matching(cooperative.getCooperativeName())
                    .createQuery();


对此:

            FullTextSession fullTextSession = Search.getFullTextSession(dao.getSession());
            QueryBuilder qb = fullTextSession.getSearchFactory()
                    .buildQueryBuilder().forEntity(MemberProfile.class).get();

            org.apache.lucene.search.Query cooperativeQuery = qb
                    .keyword()
                    .onField("cooperative.id")
                    .matching(cooperativeId)
                    .createQuery();

关于java - 在 hibernate 搜索中使用任何搜索词和合作社ID来查询合作社成员,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56874684/

10-08 21:59