Hibernate搜索通配符未返回预期值

时间:2014-01-25 12:11:23

标签: java hibernate lucene hibernate-search

我在我的模型中定义了一个字段:

@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”);

我希望得到这个实体,但结果是空的。任何建议如何构建“包含”查询?

1 个答案:

答案 0 :(得分:1)

我的猜测是大写。我假设“Intersprint GmbH”被索引为两个令牌 - “intersprint”和“gmbh”(全部小写,因为分析器已应用。在查询时,您使用带有给定术语“Interspr”的WildcardQuery。没有应用分析器在这种情况下,意味着您在下层的“intersprint”和通配符查询“ Inter ”之间没有匹配。您可以通过使用Luke检查索引来确认这一点。

作为一种解决方案,您既可以使用QueryParser(也可以使用分析器),也可以使用 QueryBuilder#keyword#wildcard(),它也将应用分析器。在后一种情况下,甚至应该为您透明地选择正确的分析仪。