ElasticSearch 索引的自定义属性
Custom attributes on ElasticSearch index
我正在 elasticsearch 上跟踪事件(我的事件有一个事件索引 class),我想将自定义属性作为事件元数据包含在内。
这些自定义属性可以由用户定义,所以不知道前面的模型。我只知道它将是一个很好的形式 Json,并且我将 json 作为字符串存储在我的事件 class.
中
我正在使用 C# 和 Nest 库来处理 ES。
示例:
{
"EventName": "myEvent",
"Data": {
"someAttr": "some Value",
"someAttr2": "some Value 2"
}
}
所以我遇到的问题是如何将其存储在我的弹性搜索事件索引中?
我想允许用户 search/filter 使用这些自定义属性的任何事件。
其实很简单
如果 "someAttr" 和所有其他属性都是简单的字段,我认为您不需要映射中的任何特定内容,因此您可以只索引数据。
但是如果您的属性(在 "Data" 内)是复杂的对象,您应该在映射中将 "Data" 定义为 type : nested
。
你可以阅读 Nested datatype over here
您可以在您的 POCO 上将 Data
定义为 Dictionary<string. object>
,并将其作为 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
仍然是您发送的内容。为避免任何潜在问题,请对相同的键使用相同的类型。
我正在 elasticsearch 上跟踪事件(我的事件有一个事件索引 class),我想将自定义属性作为事件元数据包含在内。
这些自定义属性可以由用户定义,所以不知道前面的模型。我只知道它将是一个很好的形式 Json,并且我将 json 作为字符串存储在我的事件 class.
中我正在使用 C# 和 Nest 库来处理 ES。
示例:
{
"EventName": "myEvent",
"Data": {
"someAttr": "some Value",
"someAttr2": "some Value 2"
}
}
所以我遇到的问题是如何将其存储在我的弹性搜索事件索引中?
我想允许用户 search/filter 使用这些自定义属性的任何事件。
其实很简单
如果 "someAttr" 和所有其他属性都是简单的字段,我认为您不需要映射中的任何特定内容,因此您可以只索引数据。
但是如果您的属性(在 "Data" 内)是复杂的对象,您应该在映射中将 "Data" 定义为 type : nested
。
你可以阅读 Nested datatype over here
您可以在您的 POCO 上将 Data
定义为 Dictionary<string. object>
,并将其作为 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
仍然是您发送的内容。为避免任何潜在问题,请对相同的键使用相同的类型。