使用多个关键字进行Hibernate Search索引搜索

时间:2014-03-28 17:30:01

标签: java lucene hibernate-search

我的应用程序使用 Hibernate Search 4.5.0.Final ,当我尝试使用一个关键字进行搜索时工作正常。但是如果我尝试使用两个关键字,那么第二个关键字不会被Hibernate Search使用,只有第一个被HS考虑。

例如,如果我尝试搜索" James",搜索工作正常,应用程序返回所有" James"我在索引中有。但是,如果我试着搜索詹姆斯赫特菲尔德",结果又是所有"詹姆斯"而不是名字的独特结果" James Hetfield"。我需要对待詹姆斯赫特菲尔德"如" James AND Hetfield"

编辑:我犯了一个错误。搜索使用两个关键字,但使用" OR"而不是" AND"

我的代码:

public List<Person> search(String keywords) throws DAOException {
    try {
        FullTextEntityManager fullTextEm = Search.getFullTextEntityManager(this.entityManager);
        QueryBuilder qb = fullTextEm.getSearchFactory().buildQueryBuilder().forEntity(Person.class).get();
        Query query = qb.keyword().onFields("name", "email", "username", "phone").matching(keywords).createQuery();
        FullTextQuery fullTextQuery = fullTextEm.createFullTextQuery(query);
        fullTextQuery.setProjection("name", "email", "username", "phone");
        Sort sortField = new Sort(new SortField("name_order", SortField.STRING));
        fullTextQuery.setSort(sortField);
        return fullTextQuery.getResultList();
    }
    catch (Exception e) {
        logger.error("Error searching index: " + keywords, e);
        throw new DAOException(e);
    }
}

2 个答案:

答案 0 :(得分:5)

找到解决方案。我拆分了String并使用了BooleanQuery。感谢@thomas。这是我的代码:

分裂:

String[] arrKeywords = keywords.split(" ");
this.search(Arrays.asList(arrKeywords));

然后,搜索:

public List<Person> search(String keywordsList) throws DAOException {
    try {
        FullTextEntityManager fullTextEm = Search.getFullTextEntityManager(this.entityManager);
        QueryBuilder qb = fullTextEm.getSearchFactory().buildQueryBuilder().forEntity(Person.class).get();

        List<Query> queryList = new LinkedList<Query>();
        Query query = null;

        for (String keyword : keywordsList) {
            query = qb.keyword().onFields("name", "email", "username", "phone").matching(keyword).createQuery();
            queryList.add(query);
        }

        BooleanQuery finalQuery = new BooleanQuery();
        for (Query q : queryList) {
            finalQuery.add(q, Occur.MUST);
        }

        FullTextQuery fullTextQuery = fullTextEm.createFullTextQuery(query);
        fullTextQuery.setProjection("name", "email", "username", "phone");
        Sort sortField = new Sort(new SortField("name_order", SortField.STRING));
        fullTextQuery.setSort(sortField);
        return fullTextQuery.getResultList();
    }
    catch (Exception e) {
        logger.error("Error searching index: " + keywords, e);
        throw new DAOException(e);
    }
}

答案 1 :(得分:0)

在查询构建期间使用关键字MUST。 Hibernate Search还支持使用各种策略组合查询:

-SHOULD:查询应该包含子查询的匹配元素

-MUST:查询必须包含子查询的匹配元素

-MUST NOT:查询不得包含子查询的匹配元素

聚合类似于布尔值AND,OR和NOT。

    Query combinedQuery = queryBuilder
   .bool()

   .must(queryBuilder.phrase()
   .onField("productName).sentence("samsung galaxy s8")
   .createQuery())

   .must(queryBuilder.keyword()
   .onField("productCategory").matching("smartphone")
   .createQuery())

   .createQuery();


    // wrap Lucene query in an Hibernate Query object
    org.hibernate.search.jpa.FullTextQuery jpaQuery =
    fullTextEntityManager.createFullTextQuery(combinedQuery, Product.class);

    // execute search and return results (sorted by relevance as default)
    @SuppressWarnings("unchecked")
    List<Product> results = jpaQuery.getResultList();

此参考资料来自链接http://www.baeldung.com/hibernate-search