【问题标题】:Convert NEST (Elasticsearch) Search Results to DataSet - C#将 NEST (Elasticsearch) 搜索结果转换为数据集 - C#
【发布时间】:2015-03-17 05:00:55
【问题描述】:

我正在使用 NEST 搜索我的 Elasticsearch 索引:

        var result = client.Search<MyObject>(s => s
            .From(0)
            .Size(10)
            // Query here
);

这有效并返回一个 Nest.SearchResponse 对象。 result.Hits.ToList()返回的格式是List&lt;Nest.IHit&lt;MyObject&gt;&gt;()

如何将返回的结果转换为 DataSet(或 DataTable)?

感谢任何帮助。

【问题讨论】:

  • 这个 Hits.ToList() 功能是否仍然存在?我正在尝试使用它,但它对我不起作用。

标签: c# asp.net elasticsearch dataset nest


【解决方案1】:

你需要遍历你的结果

DataTable dt = new DataTable();
dt.Columns.Add("Field1", typeof(string));
dt.Columns.Add("Field2", typeof(string));
...
foreach (IHit<JObject> x in result.Hits)
{
   dt.Rows.Add(
       x.Fields.FieldValuesDictionary["Prop1"] as JArray,
       x.Fields.FieldValuesDictionary["Prop2"] as JArray
       ...
   );
}    

阅读

还有

DocumentsWithMetaData

当您使用 NEST 0.12 进行搜索时,您会得到一个 QueryResponse 有两种方法来循环你的结果。 .Documents 是一个 IEnumerable 和 .DocumentsWithMetaData 是和 IEnumerable> 根据您的需要,其中之一可能更易于使用。

从 NEST 1.0 开始 .DocumentsWithMetaData 现在被简单地调用 .命中。

http://nest.azurewebsites.net/breaking-changes.html

【讨论】:

  • 感谢您的出色回答和资源。
【解决方案2】:

按照article 中的建议,您可以使用扩展方法将IEnumerable&lt;T&gt; 转换为DataTable

public static class IEnumerableExtensions
{
    /*Converts IEnumerable To DataTable*/
    public static DataTable ToDataTable<TSource>(this IEnumerable<TSource> data)
    {
        DataTable dataTable = new DataTable(typeof(TSource).Name);
        PropertyInfo[] props = typeof(TSource).GetProperties(BindingFlags.Public | BindingFlags.Instance);
        foreach (PropertyInfo prop in props)
        {
            dataTable.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ??
                prop.PropertyType);
        }

        foreach (TSource item in data)
        {
            var values = new object[props.Length];
            for (int i = 0; i < props.Length; i++)
            {
                values[i] = props[i].GetValue(item, null);
            }
            dataTable.Rows.Add(values);
        }
        return dataTable;
    }  
}

然后,在搜索之后,您可以执行以下操作:

var dataTable = result.Documents.ToDataTable();

其中DocumentsIEnumerable&lt;MyObject&gt;,它是返回的命中内的文档。获取这些文件的另一种方法是:

var documents=result.Hits.Select(h => h.Source);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多