我是Lucene的新手并寻求帮助。
这是我有
/**
* JPA Persistence Unit.
*/
@PersistenceContext
private EntityManager entityManager;
/**
* Hibernate Full Text Entity Manager.
*/
private FullTextEntityManager ftem;
@PostConstruct
@Async
public void intializeIndexes() throws InterruptedException {
FullTextEntityManager fullTextEntityManager =
Search.getFullTextEntityManager(entityManager);
fullTextEntityManager.createIndexer().startAndWait();
}
protected FullTextEntityManager getFullTextEntityManager() {
ftem = Search.getFullTextEntityManager(entityManager);
return ftem;
搜索方法主体
QueryBuilder qb = getFullTextEntityManager().getSearchFactory()
.buildQueryBuilder()
.forEntity(AmazonProduct.class)
.get();
BooleanJunction junction = qb.bool();
if(request.getMinPrice() != null || request.getMaxPrice() != null) {
junction.must(NumericRangeQuery.newDoubleRange(PRICE_FIELD, request.getMinPrice(), request.getMaxPrice(), true, true));
}
if(request.getMinWeight() != null || request.getMaxWeight() != null) {
junction.must(NumericRangeQuery.newDoubleRange(WEIGHT_FIELD, request.getMinWeight(), request.getMaxWeight(), true, true));
}
if (null != request.getProductTiers() && request.getProductTiers().length > 0) {
for (int tier : request.getProductTiers()) {
junction.must(NumericRangeQuery.newIntRange("productTier", tier, tier, true, true));
}
按价格按重量完成范围搜索时,这没关系。
但是我不知道如何通过眼泪来搜索,眼泪是像[1,3,5,7]这样的一系列注意力,所以我不需要这里的范围。我只需要眼泪应该是1,3,5或7的对象。我在数据库中有专栏" tier" int。那么我应该如何组织查询呢?我在这里需要NumericRangeQuery吗? 非常感谢!
答案 0 :(得分:0)
我通过使用布尔子查询
解决了这个问题if (request.getProductTiers() != null && request.getProductTiers().length > 0) {
BooleanJunction tierQuery = qb.bool();
for (int tier : request.getProductTiers()) {
tierQuery.should(NumericRangeQuery.newIntRange(PROD_TIER_KEY, tier, tier, true, true));
}
junction.must(tierQuery.createQuery());
}
我尝试了不同的查询但是这个查询
子查询的工作原理如下
+productCategory:Home~2 +(productTier:[3 TO 3] productTier:[6 TO 6])
括号内有OR条件的子查询