Hibernate Search DSL 和 Lucene 查询多个字段
Hibernate Search DSL and Lucene query on Multiple Fields
我不太确定这有多复杂,但有人可以帮我解决以下问题。
我正尝试在我的项目中实现基于员工名字和姓氏的搜索功能。为此,我使用了 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"] 进行搜索,但不能同时使用 .
我该如何解决这个问题,任何指点将不胜感激。提前致谢。
您真的想创建两个查询,一个针对名字,一个针对姓氏,然后通过 SHOULD 运算符将它们组合起来。像
Query combinedQuery = querybuilder
.bool()
.should( firstNameQuery )
.should( lastNameQuery )
.createQuery();
这意味着您正在查找其中一个查询匹配的结果。
我不太确定这有多复杂,但有人可以帮我解决以下问题。
我正尝试在我的项目中实现基于员工名字和姓氏的搜索功能。为此,我使用了 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"] 进行搜索,但不能同时使用 .
我该如何解决这个问题,任何指点将不胜感激。提前致谢。
您真的想创建两个查询,一个针对名字,一个针对姓氏,然后通过 SHOULD 运算符将它们组合起来。像
Query combinedQuery = querybuilder
.bool()
.should( firstNameQuery )
.should( lastNameQuery )
.createQuery();
这意味着您正在查找其中一个查询匹配的结果。