【问题标题】:Hibernate search / lucene search in multiple fields child collections多字段子集合中的休眠搜索/lucene搜索
【发布时间】:2015-02-01 19:49:22
【问题描述】:

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

主类是用户

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

有什么建议吗?

【问题讨论】:

  • 看来我想做的事情是不可能的。唯一的解决方法是在持久化时构建结果值,并通过瞬态字​​段将其作为父对象的一部分进行索引。不是理想的方式,但这适用于我的具体情况。
  • 你能帮我看看你所遵循的方法吗?

标签: java hibernate indexing lucene hibernate-search


【解决方案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();

【讨论】:

  • 我试过了,但这会导致所有 id=1 的记录以及所有创建日期都高于上个月的记录。它还将返回创建日期可能高于 lastMonth 但 id 1 的记录。我正在同一行子记录中查找两个搜索。
猜你喜欢
  • 1970-01-01
  • 2021-07-28
  • 2019-06-21
  • 2014-02-26
  • 1970-01-01
  • 2014-08-31
  • 1970-01-01
  • 2017-06-07
  • 2012-08-17
相关资源
最近更新 更多