2014-12-04 98 views
3

我在我的应用程序中使用Hibernate Search。其中一个子集合被映射为IndexedEmbedded。子对象有两个字段,一个id和其他日期(使用日期resoultion到毫秒)。当我搜索id = 1(或某个值)并且日期等于另一个时,我得到所有第一次和第二次匹配的情况的结果。我只想得到两个字段在同一个孩子中匹配的记录,但是我在不同的孩子中得到匹配,导致更高的结果。 下面是代码的片段Hibernate搜索/ lucene搜索多个字段子集合

主类是用户

@Indexed 
public class User {... 

@IndexedEmbedded(prefix = "score_") 
public List<Score> getScores() {...} 

得分类是 @Indexed 公共类分数{...

@Id 
@DocumentId 
public Integer getId() {...} 

@Field 
public Integer value 

@Field(analyze = Analyze.NO, indexNullAs="_null_") 
@DateBridge(resolution = Resolution.MILLISECOND) 
public Date getScoreTime() 

在我的搜索代码,我我在做以下工作

QueryBuilder queryBuilder = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(User.class).get(); 

BooleanQuery subQuery = new BooleanQuery(); 
subQuery.add(queryBuilder.keyword().onField("score_id").matching(20).createQuery(), BooleanClause.Occur.MUST); 
subQuery.add(queryBuilder.keyword().onField("score_scoreTime").ignoreFieldBridge().matching("_null").createQuery(), BooleanClause.Occur.MUST); 

在值字段上搜索(而不是scoreTime)具有相同的行为。如果我单独搜索任何字段,我会得到正确的结果。

有什么建议吗?

+0

好像什么,我试图做是不可能的。唯一的解决方法是在持久时间生成结果值,并通过临时字段将其作为父对象的一部分进行索引。不理想的方式,但这在我的具体情况。 – gmansoor 2014-12-10 18:58:46

+0

你可以帮我解决你的问题吗? – gschambial 2017-08-25 11:15:08

回答

0

你有没有尝试过这样的语法:

//look for users whos id is 1 and createDate is more than lastMonth 
Date lastMonth = ...; 
QueryBuilder userQB = searchFactory.buildQueryBuilder().forEntity(User.class).get(); 

Query luceneQuery = userQB 
    .bool() 
     .must(userQB.keyword().onField("id").matching("1").createQuery()) 
     .must(userQB.range().onField("creationDate").above(lastMonth) 
     .createQuery()) 
    .createQuery(); 
+0

我试过了,但是这会导致id = 1的所有记录,以及上个月的所有creationDate。它还会返回可能具有创建日期lastMonth但id <> 1的记录。我正在寻找同一行子记录中的两个搜索。 – gmansoor 2014-12-04 15:08:10