2014-02-12 23 views
0

推文在一个索引可以有这样的(不严格JSON的结构,只是想传达的结构:)我可以将POCO绑定到Elasticsearch命中以获得更强的输入吗?

{ 
    text: string 
    created_at: DateTime 
    mention: [ 
    { 
     name: string 
     screen_name: string 
     start: int 
     end: int 
    } 
    ], 
    hashtag: [ 
    // multiple string/int props similar to mention 
    ], 
    link: [ 
    // multiple string/int props similar to mention 
    ], 
    user: { 
    name: string 
    screen_name: string 
    profile_image_url: string 
    } 
} 

使用NEST客户端时,我得到预期的命中率,但我下的印象我可以映射POCO的结果来获得更强的类型,例如

public class TweetDocument 
{ 
    public string text { get; set; } 
    public DateTime created_at { get; set; } 
    public List<Mention> mention { get; set; } 
    public List<Hashtag> hashtag { get; set; } 
    public List<Link> link { get; set; } 
    public User user { get; set; } 
} 

public class Mention 
{ 
    public string name { get; set; } 
    public string screen_name { get; set; } 
    public int start { get; set; } 
    public int end { get; set; } 
} 

// ... other POCO's for Hashtag, Link and User 

字符串属性text和DateTime财产created_at绑定好了,但mentionhashtaglink性质均为空,当我在响应的命中例如看

var response = client.Search<TweetDocument>(q); 
var firstHit = response.Hits.Hits.FirstOrDefault(); 
// firstHit.Fields.hashtag, .mention, .link and .user are all null 

我已经看到了一些属性,但还没有真正想出如何使用它们,例如, ElasticPropertyElasticType如何从我的索引中填充这些集合,包括非集合.User子属性?

回答

1

你应该完全能够绑定这些。

什么情况是,你的文件将生活在_source如果不指定字段命中西港岛线返回_source如果指定的字段将返回的字段,当你在.Search()

指定.Fields()财产,除非作为一个数组即:

fields: { 
    mention.name: ["name1", "name2"] 
} 

这基本上是你的原始_source文件的扁平视图。

如果您可以粘贴result.ConnectionStatus.Result以查看结果如何,它将会有所帮助。

+0

我指定了不正确的字段,例如查询中的“提及。名称”而不是“提及”。我还需要用ElasticType(Name =“whatever”)]来装饰POCO,但我确实得到了它的工作。 –

+1

你可以在ConnectionSettings上使用'.SetPropertyNameInferrer(p => p.ToPythonCase())'来全局指定属性名称的外观。默认情况下为NEST camelCase的属性名称。这有助于防止需要在任何地方抹灰。 –

相关问题