我正在使用弹性搜索进行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搜索的弹性搜索中有什么办法吗?
答案 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();