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

@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/

10-10 15:18