如何在多个字段中使用通配符进行搜索?
How to search with wildcards in multiple fields?
我正在尝试实现基于休眠搜索的搜索。
我设法根据某些条件组合搜索字段,但在这种情况下,我无法使用通配符进行搜索。
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();
在我的搜索输入下,我有六个复选框,用户可以选择或不选择。
如果用户选中学生,则搜索仅适用于学生的 table。这完全没问题!
问题:
搜索输入: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)。但仍然是一个空的结果列表。
我真的很喜欢没有通配符的尝试。有没有办法在这次尝试中添加通配符搜索?
只有 Alexan 会被假定为完全匹配,尝试使用 Alexan*
使用通配符“*”应该可以。实际上,您需要构建如下内容:
qb.keyword()
.wildcard()
.onField( "user.givenname" )
.matching( "Alex*" )
.createQuery();
显然,您需要分解 DSL 以添加一些条件逻辑,但它应该可以工作。您确定示例中的 'searchterm' 添加了通配符吗?
分解 DSL 的另一种方法是创建多个独立的查询并通过 BooleanQuery
组合它们。我认为这会更具可读性。
issue/bug/feature 已修复!你可以在这里看到它:
我正在尝试实现基于休眠搜索的搜索。 我设法根据某些条件组合搜索字段,但在这种情况下,我无法使用通配符进行搜索。
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();
在我的搜索输入下,我有六个复选框,用户可以选择或不选择。 如果用户选中学生,则搜索仅适用于学生的 table。这完全没问题!
问题: 搜索输入: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)。但仍然是一个空的结果列表。
我真的很喜欢没有通配符的尝试。有没有办法在这次尝试中添加通配符搜索?
只有 Alexan 会被假定为完全匹配,尝试使用 Alexan*
使用通配符“*”应该可以。实际上,您需要构建如下内容:
qb.keyword()
.wildcard()
.onField( "user.givenname" )
.matching( "Alex*" )
.createQuery();
显然,您需要分解 DSL 以添加一些条件逻辑,但它应该可以工作。您确定示例中的 'searchterm' 添加了通配符吗?
分解 DSL 的另一种方法是创建多个独立的查询并通过 BooleanQuery
组合它们。我认为这会更具可读性。
issue/bug/feature 已修复!你可以在这里看到它: