我正在编写一种方法,搜索弹性搜索确定的查询字符串,我得到的结果有几个数据,如Highlights,Hits,score;但我只想获取和访问文档中的数据,我怎样才能在C#中实现这一点?
到目前为止,这是我的代码:
public string GetByOpinionDocumentTextElastic(string queryString)
{
var settings = new ConnectionSettings(new Uri(ConfigurationManager.AppSettings["ElasticSearchAddress"])).SetDefaultIndex("caselaw");
var client = new ElasticClient(settings);
var result = client.Search<OpinionDocumentIndexRecord>(body => body.Query(query => query.QueryString(qs => qs.Query(queryString))));
}
我的方法应该返回什么?提前谢谢!
答案 0 :(得分:3)
从中获取文档的位置可能取决于您使用的Nest版本。来自Nest 1.0 Breaking Changes page:
<强> DocumentsWithMetaData 强>
当您使用NEST 0.12进行搜索时,您可以通过两种方式返回
QueryResponse<T>
来循环搜索结果。.Documents
是IEnumerable<T>
,.DocumentsWithMetaData
和IEnumerable<IHit<T>>
取决于您的需求,其中一个可能更容易使用。从NEST 1.0开始
.DocumentsWithMetaData
现在简称为.Hits
。
所以给出你的代码示例:
NEST 0.12
result.Documents
result.DocumentsWithMetaData
NEST 1.0
result.Hits
与0.12属性的最大区别在于.Documents
只是搜索结果的集合,直接映射到您的类型OpinionDocumentIndexRecord
。虽然.DocumentsWithMetaData
具有其他Elasticsearch属性,例如“精彩集锦”,“字段”,“解释”,“类型”,但“源”属性可用作OpinionDocumentIndexRecord
。您需要或想要的最有可能取决于您的具体应用/业务需求。
因此,如果您使用的是Nest 0.12.0,并且想要一个可以轻松移植到Nest 1.0.0的解决方案,我建议您使用.DocumentsWithMetaData
,然后升级时可以更改为.Hits
Nest Client。
如果你真的只关心OpinionDocumentIndexRecord
而不管你从结果中获取什么属性,那么你可以使用下面的一个:
var myData = new List<OpinionDocumentIndexRecord>();
foreach (var hit in results.DocumentsWithMetaData)
//foreach (var hit in results.Hits) //for Nest 1.0
{
myData.Add(hit.Source);
}
return myData;
希望这有帮助。