2017-02-14 130 views
0

我正在使用ES做搜索引擎。我有類型「webContent」和兩個子類型,「htmlDocuments」,「textDocuments」。 webContent有標題,date_of_creation等字段htmlDocumentstextDocuments類型有像contenttext,url等字段。父和子id是相同的。Elasticsearch:使用NEST獲取父級和子級相同的查詢

當我在NEST搜索,我想有父母和孩子。每個孩子(htmlDocuments或textDocuments)都有一個父類型Webcontent。而且,每個WebContent只有一個htmlDocuments或textDocuments類型的子元素。例如,我要搜索一個文本文件,其中標題包含單詞「大學」:那麼,我的查詢是:

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

是的,我認爲,但這是我現在用另一個帶有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

是否可以包含Child和Parent poco課程?我不知道父母是否應該有一個孩子的財產 –