【问题标题】:How to get parent document immediately followed by child documents如何立即获取父文档,然后是子文档
【发布时间】:2018-03-08 18:23:17
【问题描述】:
我正在使用弹性搜索进行休眠搜索。我有一个要求,我需要立即获取父文档,然后是子文档。
为了维护父子关系,我有一个带有 id 和 parentId 列的表。这里 parentId 是另一个记录的 id。例如
注意:为了更好的理解运行下面的sn-p
<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
这里第一条记录是父记录,第二条记录是子记录。弹性搜索和休眠搜索有什么办法吗?
【问题讨论】:
标签:
elasticsearch
hibernate-search
【解决方案1】:
我认为这可能发生的唯一方法是,如果您的层次结构具有已知的最大深度。例如,如果您知道您将永远只有两级父母,而不是三级。
如果是你的情况,你可以有这样的模型:
@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();