如何获取父文档后紧跟子文档

时间:2018-03-08 18:23:18

标签: elasticsearch hibernate-search

我正在使用弹性搜索进行hibernate搜索。我有一个要求,我需要立即获取父文档,然后是子文档。 为了维护父子关系,我有一个id为id的表和parentId列。这个parentId是另一个记录的id.e.g

注意:为了更好地理解,请运行以下内容

<html>
<body>

<table border="1" >
  <tr>
    <th>ID</th>
    <th>Name</th>
    <th>ParentId</th>
  </tr>
  <tr>
    <td>1</td>
    <td>Samule</td>
    <td>0</td>
    
  </tr>
  <tr>
    <td>2</td>
    <td>jhon</td>
    <td>1</td>
    
  </tr>
 <tr>
    <td>3</td>
    <td>peeter</td>
    <td>2</td>
    
  </tr>
</table>

</body>
</html>

预期产出:

例如:搜索名称等于 Samule 时,需要按以下顺序获取

1

2

这里的第一个记录是父记录,第二个记录是子记录。在使用hibernate搜索的弹性搜索中有什么办法吗?

1 个答案:

答案 0 :(得分:0)

我认为可能发生这种情况的唯一方法是,如果您的层次结构具有已知的最大深度。例如,如果你知道你只有两个级别的父母,而不是三个。

如果是这种情况,您可以拥有这样的模型:

@Indexed
public class Document {

  @DocumentId
  private int id;

  @Field
  private String text;

  @IndexedEmbedded(depth = /* YOUR MAX DEPTH HERE */)
  private Document parent;

  @Field(name = "path_sort", analyze = Analyze.NO)
  public String getPath() {
    return parent == null ? id : parent.getPath() + "." + id;
  }

}

按照以下方式执行搜索:

FullTextSession fts = ... ;

QueryBuilder qb = fts.getSearchFactory()
                .buildQueryBuilder()
                .forEntity( Document.class )
                .get();

Query query = qb.keyword().onFields(
                "text",
                "parent.text",
                "parent.parent.text"
                /* and so on, on as many levels as necessary */
        )
        .matching( "some string" )
        .createQuery();

Sort sort = qb.sort().byField( "path_sort" ).createSort();

List<Document> result = fts.createFullTextQuery( query, Document.class )
                .setSort( sort )
                .list();