我在模型中定义了一个字段:
@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()来应用分析器。在后一种情况下,甚至应该透明地为您挑选合适的分析仪。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句