Hibernate搜索/ lucene搜索多个字段的子集合

时间:2014-12-04 02:50:47

标签: java hibernate indexing lucene hibernate-search

我在我的应用程序中使用Hibernate Search。其中一个子集合映射为IndexedEmbedded。子对象有两个字段,一个是id,另一个是date(使用date resoultion到milliseconds)。当我搜索id = 1(或某个值)并且date等于另一个时,我得到第一个和第二个匹配的所有情况的结果。我想只得到两个字段在同一个孩子中匹配的记录,但我在不同的孩子中得到匹配,从而产生更高的结果。 这是代码的片段

主要类是用户

@Indexed
public class User {...

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

分数类是     @索引     公共课成绩{...

@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)具有相同的行为。如果我在任何字段上单独搜索,我会得到正确的结果。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您是否尝试过这种语法:

//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();