我正在使用ES进行搜索引擎。我有类型“webContent”和两个子类型,“htmlDocuments”,“textDocuments”。 webContent 包含title,date_of_creation等字段。 htmlDocuments 和 textDocuments 类型包含contenttext,url等字段。父ID和子ID是同样的。
当我在NEST搜索时,我希望有父母和孩子。每个子项(htmlDocuments或textDocuments)都具有Webcontent类型的父项。而且,每个WebContent只有一个类型为htmlDocuments或textDocuments的子项。例如,我想搜索一个Text文档,其中Title包含单词“university”:所以,我的查询是:
var child = client.Search<textDocuments>(s => s
.Query(q => q
.HasParent<webContent>(c => c
.Query(cq => cq.MatchPhrasePrefix(m => m.Field(p => p.title).Query("university"))))
));
所以,这返回textDocuments。父母和孩子都可以归还吗?或者一种获取父母而不进行其他查询的方法?我想避免像我现在这样做两个查询:
var hits = resul.Hits.ToList();
// for i = 0 until hits.count:
var parent = client.Search<webContent>(b => b
.Query(q => q
.Term(tx => tx.id, child.hits[i].Parent)));
感谢。
答案 0 :(得分:0)
所以这就是我解决问题的方法。我首先创建了一个带有父/子映射的索引,如下所示:
var request = new CreateIndexRequest("things");
request.Mappings = new Mappings();
request.Mappings.Add("parent", new TypeMapping());
request.Mappings.Add("child", new TypeMapping { ParentField = new ParentField { Type = "parent" } });
_client.CreateIndex(request);
然后要包含子文件的父文档,我执行了这样的查询:
SearchRequest request = new SearchRequest("things", "child")
{
From = 0,
Size = 10,
Query = new HasParentQuery
{
Type = "parent",
InnerHits = new InnerHits(),
Query = new MatchAllQuery()
}
};
var response = _client.Search<Child>(request);