【发布时间】:2018-04-09 20:14:10
【问题描述】:
我们正在开发一个应用程序,我们从不同来源和不同格式接收 json 格式的数据,用户也可以在其中添加这些来源,所以我们不知道 json 格式会有哪些属性
我们的应用程序将该数据呈现为网格格式,并且网格提供对该数据的过滤、排序、分页、分组等类型的标准操作。
我们决定使用弹性搜索来存储如此庞大的非结构化数据。在后端,我们使用 .NET (C#)。
开始使用批量 API 来索引数据。 这是示例json: myJson = @"{""index"":{""_index"":""abc"",""_type"":""abc"",""_id"":1}}, {""Name"":""ApplicationFrameHost"",""CPU"":1.25,""Company"":null,""Product"":null,""Path"":null} {""index"":{""_index"":""abc"",""_type"":""abc"",""_id"":2}}, {""名称"":""audiodg"",""CPU"":1.5625,""公司"":null,""产品"":null,""路径"":null} {""index"":{""_index"":""abc"",""_type"":""abc"",""_id"":3}}, {""名称"":""计算器"","CPU"":0.5,""公司"":null,""产品"":null,""路径"":null} {""index"":{""_index"":""abc"",""_type"":""abc"",""_id"":4}}, {""名称"":""chrome"",""CPU"":144.109375,""公司"":null,""产品"":null,""路径"":null} {""index"":{""_index"":""abc"",""_type"":""abc"",""_id"":5}}, {""Name"":""chrome"",""CPU"":3384.609375,""Company"":null,""Product"":null,""Path"":null}
";
在 C# 代码方面:
var connectionSettings = new ConnectionSettings(new Uri("http://localhost:9200/"));
connectionSettings.DisableDirectStreaming(true);
var client2 = new ElasticClient(connectionSettings);
var jsonPostData = new PostData<object>(myJson);
var bulkRequestParameters = new BulkRequestParameters
{
};
Func<BulkRequestParameters, BulkRequestParameters> convert = delegate (BulkRequestParameters s)
{
s.ErrorTrace(true);
return s.Refresh(Refresh.True);
};
ElasticsearchResponse<VoidResponse> response = client2.LowLevel.Bulk<VoidResponse>("abc", "abc", jsonPostData, convert);
它确实成功地将数据插入到弹性中。
只是想确认这是执行此操作的最佳方式吗?
我们面临的问题 我们需要对索引数据的任何字段进行分组(用户可以在呈现数据时对任何字段进行分组,因此我们需要在运行时聚合数据。 如何使用 C# API 实现这一点?
另外,如何使用 C# API 对多个字段进行过滤?
我是弹性搜索的新手,所以不太了解它有哪些功能以及使用 C# API 实现此目的的方法是什么,尽管我在 Kibana 控制台上玩过一些分组,但我收到以下错误: 默认情况下,在文本字段上禁用 Fielddata。在 [Name] 上设置 fielddata=true,以便通过反转倒排索引将 fielddata 加载到内存中。请注意,这可能会占用大量内存。或者使用关键字字段。
【问题讨论】:
标签: c# elasticsearch