Java Hibernate使用工作查询搜索空结果
休眠:5.2.8.最终版本Java Hibernate使用工作查询搜索空结果,java,hibernate,hibernate-search,Java,Hibernate,Hibernate Search,休眠:5.2.8.最终版本 休眠搜索:5.7.0.Final 配置: spring.jpa.properties.hibernate.search.analyzer=org.apache.lucene.analysis.en.EnglishAnalyzer logging.level.org.hibernate.search.fulltext_query=debug 我的代码: FullTextEntityManager ftsEntityManager = Search.getFullTex
休眠搜索:5.7.0.Final
配置:
spring.jpa.properties.hibernate.search.analyzer=org.apache.lucene.analysis.en.EnglishAnalyzer
logging.level.org.hibernate.search.fulltext_query=debug
我的代码:
FullTextEntityManager ftsEntityManager = Search.getFullTextEntityManager(entityManager);
QueryBuilder queryBuilder = ftsEntityManager.getSearchFactory()
.buildQueryBuilder().forEntity(Report.class).get();
BooleanQuery.Builder builder = new BooleanQuery.Builder();
BooleanQuery.Builder cmpBuilder = new BooleanQuery.Builder();
companies.forEach(cmp -> cmpBuilder.add(
NumericRangeQuery.newLongRange("merchant.company.company_id", cmp.getId(), cmp.getId(), true, true),
BooleanClause.Occur.SHOULD));
builder.add(cmpBuilder.build(), BooleanClause.Occur.MUST);
builder.add(new TermQuery(new Term("status", status.name())), BooleanClause.Occur.MUST);
org.apache.lucene.search.Query fromQuery = queryBuilder.range()
.onField("createdAt")
.above(from)
.createQuery();
org.apache.lucene.search.Query toQuery = queryBuilder.range()
.onField("createdAt")
.below(to)
.createQuery();
builder.add(fromQuery, BooleanClause.Occur.MUST);
builder.add(toQuery, BooleanClause.Occur.MUST);
FullTextQuery fullTextQuery = ftsEntityManager.createFullTextQuery(builder.build(), Report.class);
int results = fullTextQuery.getResultSize();
EntityGraph graph = this.entityManager.getEntityGraph("Report.fetchMerchantAndAccount");
List resultList = fullTextQuery
.setFirstResult(pageable.getOffset())
.setMaxResults(pageable.getPageSize())
.setHint("javax.persistence.fetchgraph", graph)
.getResultList();
记录的查询:
2017-03-24 02:39:50.942 DEBUG 1984 --- [tp1560534902-96] org.hibernate.search.fulltext_query : HSEARCH000274: Executing Lucene query '+(merchant.company.company_id:[2 TO 2]) +status:COMPLETE +createdAt:[0000020161102000000000000000 TO *] +createdAt:[* TO 0000020170324235959999999999]'
我已经在Luke中测试了这个查询,它运行良好:
看起来此参数中存在问题
+(merchant.company.company\u id:[2到2])+状态:COMPLETE
,但我无法找出问题所在。问题是我应该使用QueryBuilder而不是Lucene类。
因此,改变这一点:
companies.forEach(cmp -> cmpBuilder.add(
NumericRangeQuery.newLongRange("merchant.company.company_id", cmp.getId(), cmp.getId(), true, true),
BooleanClause.Occur.SHOULD));
为此:
companies.forEach(cmp -> cmpBuilder.add(queryBuilder.range().onField("merchant.company.company_id")
.from(cmp.getId()).to(cmp.getId()).createQuery(), BooleanClause.Occur.SHOULD));
builder.add(queryBuilder.keyword().onField("status").matching(status).createQuery(), BooleanClause.Occur.MUST);
这是:
builder.add(new TermQuery(new Term("status", status.name())), BooleanClause.Occur.MUST);
为此:
companies.forEach(cmp -> cmpBuilder.add(queryBuilder.range().onField("merchant.company.company_id")
.from(cmp.getId()).to(cmp.getId()).createQuery(), BooleanClause.Occur.SHOULD));
builder.add(queryBuilder.keyword().onField("status").matching(status).createQuery(), BooleanClause.Occur.MUST);
解决问题