在进行使用Fields()
的搜索时,如何获取强类型的对象列表?例如:
var searchResult = client.Search<Person>(s => s
.Fields("title", "name")
.Query(q => q.Match(...etc...)
.Highlight(...etc...)
);
使用.Fields()
时,似乎泛型类型参数无效,因为返回的Hits
具有空.Source
属性。
(我希望有一种方法可以做到这一点,而无需手动将搜索结果映射回我原来的Person
POCO。)
答案 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.FieldSelections
或searchResult.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)));
}