2017-02-14 7 views
0

Ich mache eine Suchmaschine mit ES. Ich habe den Typ "webContent" und zwei Untertypen, "htmlDocuments", "textDocuments". webContent hat Felder wie title, date_of_creation usw. htmlDocuments und textDocuments Typen haben Felder wie contenttext, url usw. Die Eltern- und Kind-ID sind identisch.Elasticsearch: Holen Eltern und Kind in derselben Abfrage mit NEST

Wenn ich in NEST suche, möchte ich Eltern und Kind haben. Jedes untergeordnete Element (htmlDocuments oder textDocuments) hat ein übergeordnetes Element vom Typ Webcontent. Außerdem hat jeder WebContent nur ein Kind vom Typ htmlDocuments oder textDocuments. Zum Beispiel möchte ich ein Textdokument suchen, wo Titel das Wort „Universität“ enthalten: Also, meine Frage ist:

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")))) 
      )); 

Also, diese Rückkehr Textdokumente. Ist es möglich, Eltern und Kinder zurückzugeben? Oder eine Möglichkeit, die Eltern ohne eine andere Abfrage zu bekommen? Ich möchte vermeiden, zwei Abfragen wie ich gerade tun:

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

Vielen Dank.

+1

Hielten Sie Abflachung Eltern/Kind in einem Dokument, gegeben jedem Elternteil hat nur ein Kind? –

+0

Ja, ich dachte es, aber das ist die Struktur, die ich jetzt mit einer anderen Suchmaschine mit einer SQL-Datenbank verwende. –

+0

Haben Sie das jemals herausgefunden? Ich kann kein Beispiel finden. –

Antwort

0

So habe ich das Problem gelöst. Ich habe zuerst einen Index mit einem Eltern/Kind-Mapping wie folgt aus:

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

Dann Stammdokumente mit Kindern gehören ich die Abfrage wie folgt durchgeführt:

 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

Wäre es möglich, Kinder- und Eltern-Poco-Klassen einzuschließen? Ich kann nicht herausfinden, ob Eltern ein Kind besitzen sollten oder nicht –

Verwandte Themen