Hibenate在多个字段上搜索DSL和Lucene查询

时间:2016-02-20 14:13:38

标签: lucene hibernate-search

我不确定这可能涉及多少,但有人可以帮我解决下面的问题。

我正在尝试根据员工的姓名和名字在我的项目中实施搜索功能。我为此目的使用了Spring Data REST和Hibernate Search。

@Transactional
public  search(String searchText) {

    FullTextEntityManager fullTextEntityManager = org.hibernate.search.jpa.Search
            .getFullTextEntityManager(entityManager);
    QueryBuilder qb = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(Employee.class).get();
    org.apache.lucene.search.Query luceneQuery = qb.keyword().wildcard()
            .onFields("firstName", "middleName", "lastName").matching(searchText + "*").createQuery();
    javax.persistence.Query jpaQuery = fullTextEntityManager.createFullTextQuery(luceneQuery, Employee.class);
    List result = jpaQuery.getResultList();
    List<EmployeeSearchDTO> listOfDTO = new ArrayList<>();
    EmployeeSearchDTO employeeDTO;
    Iterator<Employee> itr = result.iterator();
    while (itr.hasNext()) {
        Employee employee = itr.next();
        employeeDTO = new EmployeeSearchDTO(employee);
        listOfDTO.add(employeeDTO);

    }
}

当我搜索“john doe”时,我希望结果与下面的两个匹配   名字:John姓名:Doe
  名字:johnathan姓氏:Doe
但事实并非如此,我只能基于 FirstName [“john”]或LastName [“doe”]进行搜索,但不能同时搜索

我如何解决这个问题,任何指针都会非常感激。谢谢你。

1 个答案:

答案 0 :(得分:0)

你真的想创建两个查询,一个针对名字,一个针对姓氏,然后通过 SHOULD 运算符组合它们。像

这样的东西
Query combinedQuery = querybuilder
.bool()
    .should( firstNameQuery )
    .should( lastNameQuery )
.createQuery();

这意味着您正在寻找任一查询匹配的结果。