我在我的模型中定义了一个字段:
@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'中有一个价值。如果我打电话给方法:
搜索( “Interspr”);
我希望得到这个实体,但结果是空的。任何建议如何构建“包含”查询?
答案 0 :(得分:1)
我的猜测是大写。我假设“Intersprint GmbH”被索引为两个令牌 - “intersprint”和“gmbh”(全部小写,因为分析器已应用。在查询时,您使用带有给定术语“Interspr”的WildcardQuery。没有应用分析器在这种情况下,意味着您在下层的“intersprint”和通配符查询“ Inter ”之间没有匹配。您可以通过使用Luke检查索引来确认这一点。
作为一种解决方案,您既可以使用QueryParser(也可以使用分析器),也可以使用 QueryBuilder#keyword#wildcard(),它也将应用分析器。在后一种情况下,甚至应该为您透明地选择正确的分析仪。