如何在Elasticsearch.Net(NEST)中使用POCO和Fields?

时间:2015-02-27 20:33:31

标签: nest

在进行使用Fields()的搜索时,如何获取强类型的对象列表?例如:

var searchResult = client.Search<Person>(s => s
    .Fields("title", "name")
    .Query(q => q.Match(...etc...)
    .Highlight(...etc...)
);

使用.Fields()时,似乎泛型类型参数无效,因为返回的Hits具有空.Source属性。

(我希望有一种方法可以做到这一点,而无需手动将搜索结果映射回我原来的Person POCO。)

1 个答案:

答案 0 :(得分:2)

在查询中使用fields参数时,elasticsearch会在响应的字段部分返回指定的字段。

{
"took" : 36,
"timed_out" : false,
"_shards" : {
    "total" : 2,
    "successful" : 2,
    "failed" : 0
},
"hits" : {
    "total" : 18,
    "max_score" : 1.0,
    "hits" : [{
            "_index" : "nest_test_data-2672",
            "_type" : "elasticsearchprojects",
            "_id" : "1",
            "_score" : 1.0,
            "fields" : {
                "pingIP" : ["127.0.0.1"],
                "country" : ["Faroese"],
                "intValues" : [1464623485],
                "locScriptField" : [0],
                "stupidIntIWantAsLong" : [0],
                "floatValues" : [84.96025, 95.19422],
                "floatValue" : [31.93136],
                "myAttachment" : [""],
                "doubleValue" : [31.931359384176954],
                "suggest" : [""],
                "version" : [""],
                "content" : ["Bacon ipsum dolor sit amet tail non prosciutto shankle turducken, officia bresaola aute filet mignon pork belly do ex tenderloin. Ut laboris quis spare ribs est prosciutto, non short ribs voluptate fugiat. Adipisicing ex ad jowl short ribs corned beef. Commodo cillum aute, sint dolore ribeye ham hock bresaola id jowl ut. Velit mollit tenderloin non, biltong officia et venison irure chuck filet mignon. Meatloaf veniam sausage prosciutto qui cow. Spare ribs non bresaola, in venison sint short loin deserunt magna laborum pork loin cillum."],
                "longValue" : [-7046341211867792384],
                "myBinaryField" : [""],
                "name" : ["pyelasticsearch"],
                "boolValue" : [false],
                "id" : [1],
                "startedOn" : ["1994-02-28T12:24:26.9977119+01:00"]
            }
        }
    ]
}
}

您可以从searchResult.FieldSelectionssearchResult.Hits[...].Fields检索它们。

在你的情况下,Source filtering应该更方便。

        [Test]
    public void MatchAllShortcut()
    {
        var results = this.Client.Search<ElasticsearchProject>(s => s
            .From(0)
            .Size(10)
            .Source(source=>source.Include(f => f.Id, f => f.Country))
            .SortAscending(f => f.LOC)
            .SortDescending(f => f.Country)
            .MatchAll()
        );

        Assert.NotNull(results);
        Assert.True(results.IsValid);

        Assert.NotNull(results.Hits);
        Assert.GreaterOrEqual(results.Hits.Count(), 10);
        Assert.True(results.Hits.All(h => !string.IsNullOrEmpty(h.Source.Country)));

        Assert.NotNull(results.Documents);
        Assert.GreaterOrEqual(results.Documents.Count(), 10);
        Assert.True(results.Documents.All(d => !string.IsNullOrEmpty(d.Country)));
    }