2017-02-14 92 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课程?我不知道父母是否应该有一个孩子的财产 –