2017-02-14 4 views
0

私はESで検索エンジンをやっています。私はタイプ "webContent"と2つのサブタイプ "htmlDocuments"、 "textDocuments"を持っています。 webcontentには、title、date_of_creationなどのフィールドがあります。htmlDocumentsおよびtextDocumentsにはcontenttext、urlなどのフィールドがあります。親と子のIDは同じです。Elasticsearch:NESTで同じクエリで親子を取得

NESTで検索すると、親と子が必要です。すべての子(htmlDocumentsまたはtextDocuments)には、Webcontent型の親があります。また、すべてのWebContentにはhtmlDocumentsまたはtextDocumentsタイプの子が1つしかありません。だから、私のクエリは次のとおりです:

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例えば、私はタイトルが単語「大学」を含むテキスト文書を検索します。両親と子供の両方を返すことは可能ですか?または別のクエリを実行せずに親を取得する方法?私は今のように2つの質問を避けたい:

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

を使用すると、1つに、親/子の平坦化を検討しました各親が子供を1人しか持たないことを前提としていますか? –

+0

はい、私は考えましたが、これはSQLデータベースを持つ別の検索エンジンで今使用している構造です。 –

+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); 
+0

子と親のpocoクラスを含めることは可能でしょうか?私は親が子供の財産を持つべきかどうかを理解できない –

関連する問題