2014-05-15 28 views
3

該文檔似乎表明我可以返回字段的子集而不是整個文檔。這裏是我的代碼:加載Elasticsearch Nest中的特定字段查詢

var result = client.Search<MyObject>(s => s 
       .Fields(f => f.Title) 
       .Query(q => q 
        .QueryString(qs => qs 
         .OnField("title") 
         .Query("the")))); 

我尋找這個詞「的」的「標題」字段,並希望只返回「標題」。我的result.Documents對象包含10個空對象。

我看到我想要的值,但它在搜索響應深: result.Hits [0] .Fields.FieldValues [0] ...

有沒有更好的方式來獲得在「標題」字段列表已返回?

我的數據(截)映射是這樣的......

{ 
    "myidex": { 
     "mappings": { 
     "myobject": { 
      "properties": { 
       "title": { 
        "type": "string" 
       }, 
       "artists": { 
        "properties": { 
        "id": { 
         "type": "string", 
         "index": "not_analyzed", 
         "analyzer": "fullTerm" 
        }, 
        "name": { 
         "type": "string", 
         "index": "not_analyzed", 
         "analyzer": "fullTerm" 
        } 
        } 
       }        
      } 
     } 
     } 
    } 
} 

和我的類對象是這樣的:

[Table("MyTable")] 
[Serializable] 
[ElasticType(Name="myobject")] 
public class MyObject 
{ 
    [ElasticProperty] 
    public string Title { get; set; } 

    [JsonIgnore] 
    public string Artistslist { get; set; } 
    [ElasticProperty(Analyzer = "caseInsensitive")] 
    public List<Person> Artists { get; set; }   
} 

[Serializable] 
public class Person 
{ 
    [ElasticProperty(Analyzer = "fullTerm", Index = FieldIndexOption.not_analyzed)] 
    public string Name { get; set; } 
    [ElasticProperty(Analyzer = "fullTerm", Index = FieldIndexOption.not_analyzed)] 
    public string Id { get; set; } 
} 

Artistslist來自我的數據源(SQL),那麼在索引數據之前,我將它解析爲一個新的List對象。

+0

您使用的是哪個版本的NEST? –

+0

預發佈版本的nest和elasticsearch.net(通過nuget)。我相信它是1.0.0 beta1 – bigerock

+0

如果您的'result.Documents'對象爲空,則可能是映射問題。你可以將MyObject類的定義添加到問題中。 –

回答

4

我覺得這個深度嵌套的值是做在Elasticsearch 1.0和領域如何局部變化,現在返回數組(見1.0 Breaking Changes - Return Values瞭解詳細信息。)。這在NEST 1.0 Breaking Changes文檔中有解決;在Fields()vs SourceIncludes()部分。它顯示了使用FieldValue輔助方法訪問這些值的示例。在此基礎上,嘗試以下操作:

所有項目:

foreach (var hit in result.Hits) 
{ 
    var title = hit.Fields.FieldValue<MyObject, string>(f => f.Title); 
} 

對於一個特定項目:

var title = result.Hits.ElementAt(0) 
        .Fields.FieldValue<MyObject, string>(f => f.Title); 

我知道它仍然是一個有點冗長,但它應該爲你工作,將處理Elasticsearch 1.0的新數組返回格式。

+1

在這裏的錢是正確的。對於'FieldValue'的語法將在接下來的測試版將更新爲方式更簡潔:https://github.com/elasticsearch/elasticsearch-net/pull/619 –

+0

好像它的工作,但這些代碼不會編譯... \t \t result.Hits [0] .Fields.FieldValue (F => f.Title)... \t不能與[]適用索引,以類型爲「的表達式System.Collections.Generic .IEnumerable >' – bigerock

+0

你是對的,我忘了'Hits'是一個IEnumerable,你需要對每個項目進行foreach。我已經更新了答案。 –

2

我發現在鳥巢的GitHub庫解決方案。他們創造了一個關於這個問題的問題。您應該使用FielddataFields而不是Fields。

https://github.com/elastic/elasticsearch-net/issues/1551

var result = client.Search<MyObject>(s => s 
       .FielddataFields(f => f.Title) 
       .Query(q => q 
        .QueryString(qs => qs 
         .OnField("title") 
         .Query("the")))); 

,並響應你看到FieldSelections。你得到你想要的領域。