我试图实现基于hibernate-search的搜索。 我设法根据某些条件组合搜索字段,但在这种情况下,我无法使用通配符进行搜索。
List<String> spalten = new ArrayList<String>();
FullTextEntityManager fullTextEntityManager = org.hibernate.search.jpa.Search
.getFullTextEntityManager(em);
QueryBuilder qb = fullTextEntityManager.getSearchFactory()
.buildQueryBuilder().forEntity(BeitragVO.class).get();
List<BeitragVO> results;
// add fields for search
List<String> fields= new ArrayList<String>();
if (student) {
logger.info("hit student");
spalten.add("user.surname");
spalten.add("user.givenname");
}
if (company) {
logger.info("hit company");
spalten.add("company.name");
}
for (String string : fields) {
logger.info(string);
}
logger.info("Searchterm:" + searchterm);
org.apache.lucene.search.Query luceneQuery = qb.keyword()
.onFields(fields.toArray(new String[fields.size()]))
.matching(searchterm).createQuery();
logger.info("Query: " + luceneQuery.toString());
javax.persistence.Query jpaQuery = fullTextEntityManager
.createFullTextQuery(luceneQuery, ArticleVO.class);
results= jpaQuery.getResultList();
在我的搜索输入下,我有六个复选框,用户可以查看。 如果用户检查学生,则搜索仅适用于学生的表格。这完全没用!
问题: 搜索输入:Alexan (对于亚历山大)
没有找到结果!
我试过这样的东西,用于通配符搜索:
TermContext tc = qb.keyword();
WildcardContext wcc = tc.wildcard();
if (student) {
TermMatchingContext tmc = wcc.onField("user.surname");
tmc = tmc.andField("user.givenname");
luceneQuery = tmc.matching(searchterm).createQuery();
}
这是正确的语法,我得到了正确的查询(user.surname:alexander user.givenname:alexander)。但仍然是一个空的结果列表。
我真的很喜欢没有通配符的尝试。有没有办法在这次尝试中添加通配符搜索?
答案 0 :(得分:1)
使用通配符'*'它应该可以工作。实际上你需要构建类似的东西:
qb.keyword()
.wildcard()
.onField( "user.givenname" )
.matching( "Alex*" )
.createQuery();
显然,您需要分解DSL以添加一些条件逻辑,但它应该可以工作。您确定示例中的'searchterm'是否添加了通配符?
分解DSL的另一种方法是创建多个独立查询并通过BooleanQuery
进行组合。我认为这会更具可读性。
问题/错误/功能得到修复!你可以在这里看到它:
答案 1 :(得分:0)
仅 Alexan 将被视为完全匹配,请尝试使用 Alexan *