2014-02-25 108 views
2

這是我搜索的文件,但它不會返回任何結果:當我用這個作爲Elasticsearch搜索查詢NEST無法找到文檔彈性搜索可以找到

var results = ElasticClient.Search<ClusterInstance>(body => body 
    .AllIndices() 
    .Size(500) 
    .Query(query => query 
     .QueryString(qs => qs.Query("MyTestName")) 
    ) 
); 
resultobject.clusterinstances = results.Documents.ToList(); 

,我得到了我需要的結果(其中2個)。

{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "query_string": { 
      "query": "MyTestName" 
      } 
     } 
     ], 
     "must_not": [], 
     "should": [] 
    } 
    }, 
    "from": 0, 
    "size": 10, 
    "sort": [], 
    "facets": {} 
} 

ElasticClient創作:

private static ElasticClient ElasticClient 
{ 
    get 
    { 
     var uri = new Uri("http://localhost:9200") 
     return new ElasticClient(new ConnectionSettings(uri)); 
    } 
} 

索引:

foreach (var cluster in db.ClusterInstances.Where(a => a.Active.Equals(true))) 
{ 
    client.Index(cluster, "cmdbcli", "clusters", cluster.ClusterInstanceID); 
} 

版本:NEST - Elasticsearch客戶端0.12.0(的NuGet)

回答

4

雖然克里斯地幔是正確的查詢不太匹配,他們應該差不多了功能上等同。

你的搜索上/_all/clusterinstances/_search做搜索,你可能想要的是:

.Search(s=>s 
    .AllIndices() 
    .AllTypes() 
    ... 

.Search(s=>s 
    .AllIndices() 
    .Type("clusters") 
    ... 

NEST默認通過lowercasing和複數化的CLR類型名推斷的elasticsearch類型。

如果你設置你的connectionsettings這樣的:

var settings = new ConnectionSettings(uri) 
    .SetDefaultIndex("cmdbcli") 
    .MapDefaultTypeNames(d=>d 
     .Add(typeof(ClusterInstance), "clusters") 
    ) 
    .... 

然後

.Search<ClusterInstance>(s=>s.Query()) 

將默認爲/cmdbcli/clusters/_search

+0

沒錯!而已!謝謝! –

1

您的查詢不匹配。您的代碼生成的將是簡單的query_string查詢,而不是您在JSON查詢中定義的bool查詢。我認爲你需要改變你的代碼產生類似的查詢你在JSON定義一個:

var results = ElasticClient 
    .Search<ClusterInstance>(body => body 
     .AllIndices() 
     .Size(500) 
     .Query(query => query 
      .Bool(@bool => @bool 
       .Must(must => must 
        .QueryString(qs => qs 
         .Query("MyTestName")))))); 

resultobject.clusterinstances = results.Documents.ToList();