Elasticsearch:使用NEST在同一查询中获取父级和子级

时间:2017-02-14 10:16:34

标签: c# elasticsearch nest

我正在使用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)));

感谢。

1 个答案:

答案 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);