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 仍然是您发送的内容。为避免任何潜在问题,请对相同的键使用相同的类型。