我在 elasticsearch 上跟踪事件(我的事件类有一个事件索引),我想将自定义属性作为事件元数据包含在内。
这些自定义属性可以由用户定义,所以不知道前面的模型。我只知道它将是一个格式良好的 Json,并且我将该 json 作为字符串存储在我的事件类中。
我正在使用 C# 和 Nest 库来处理 ES。
例子:
{
"EventName": "myEvent",
"Data": {
"someAttr": "some Value",
"someAttr2": "some Value 2"
}
}
所以我遇到的问题是如何将它存储在我的 Elasticsearch 事件索引中?
我想允许用户使用这些自定义属性搜索/过滤任何事件。
最佳答案
您可以定义Data
作为 Dictionary<string. object>
在您的 POCO 上并将其索引为 object
Elasticsearch 中的字段类型,将根据您的示例对其进行索引。
然后,您可以在搜索时使用字典中的特定键,例如
public class Document
{
public Dictionary<string, object> Data { get; set; }
}
var client = new ElasticClient();
client.CreateIndex("my-index", c => c
.Mappings(m => m
.Map<Document>(mm => mm
.AutoMap()
.Properties(p => p
.Object<Dictionary<string, object>>(o => o
.Name(n => n.Data)
)
)
)
)
);
创建以下映射
{
"mappings": {
"document": {
"properties": {
"data": {
"type": "object"
}
}
}
}
}
然后我们可以搜索特定的键
client.Search<Document>(s => s
.Query(q => q
.Term(f => f.Data["sameAttr"], "some Value")
)
);
这将是以下搜索
{
"query": {
"term": {
"data.sameAttr": {
"value": "some Value"
}
}
}
}
如果允许任意键,您需要注意的一件事是,
Data
中给定键的值类型必须相同。在不同的文件中;有一些类型的组合可以转换为索引,但是 _source
仍将是您发送的内容。为避免任何潜在问题,请对相同的键使用相同的类型。
关于c# - ElasticSearch 索引上的自定义属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41069052/