我在模型中定义了一个字段:
@Column(name = "name")
@Field(index = Index.YES, analyze = Analyze.YES, store = Store.NO)
private String name;
我的查询是
public Result search(String term, int offset, int limit) {
WildcardQuery regexQuery = new WildcardQuery(new org.apache.lucene.index.Term("name", "*" + term + "*"));
QueryBuilder qb = getFullTextSession().getSearchFactory().buildQueryBuilder().forEntity(Company.class).get();
org.apache.lucene.search.Query query =
qb.bool().should(qb.phrase().onField("address.street").sentence(term).createQuery())
.should(regexQuery)
.createQuery();
FullTextQuery hibQuery = getFullTextSession().createFullTextQuery(query, Company.class);
hibQuery.setFirstResult(offset);
hibQuery.setMaxResults(limit);
Result result = new Result();
result.total = hibQuery.getResultSize();
result.items = hibQuery.list();
return result;
}
我在“ Intersprint GmbH”数据库(也已建立索引)中具有价值。如果我调用该方法:
search(“ Interspr”);
我希望得到这个实体,但结果是空的。任何建议,我怎么能建立一个“包含”查询?
最佳答案
我的猜测是大写。我假设“ Intersprint GmbH”被索引为两个标记-“ intersprint”和“ gmbh”(均小写,因为应用了分析器。在查询时,您使用带有给定术语“ Interspr”的WildcardQuery。没有应用分析器在这种情况下,意味着小写的“ intersprint”和通配符查询“ Inter”之间不匹配,可以通过使用Luke检查索引来确认。
作为解决方案,您可以使用QueryParser(也使用分析器),也可以使用QueryBuilder#keyword#wildcard()来应用分析器。在后一种情况下,甚至应该透明地为您挑选合适的分析仪。
关于java - Hibernate搜索通配符未返回期望值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21350339/