【问题标题】:Custom attributes on ElasticSearch indexElasticSearch 索引上的自定义属性
【发布时间】:2016-12-09 21:17:29
【问题描述】:

我在 elasticsearch 上跟踪事件(我的事件类有一个事件索引),我想包含自定义属性作为事件元数据。

这些自定义属性可以由用户自己定义,所以不知道前面的模型。我只知道它将是一个格式良好的 Json,并且我将该 json 作为字符串存储在我的事件类中。

我正在使用 C# 和 Nest 库来处理 ES。

例子:

{
    "EventName": "myEvent",
    "Data": {
        "someAttr": "some Value",
        "someAttr2": "some Value 2"
     }
}

那么我遇到的问题是如何将它存储在我的弹性搜索事件索引中?

我想允许用户使用这些自定义属性搜索/过滤任何事件。

【问题讨论】:

    标签: c# elasticsearch nest


    【解决方案1】:

    您可以在您的 POCO 上将 Data 定义为 Dictionary<string. object>,并将其索引为 Elasticsearch 中的 object 字段类型,该字段类型将根据您的示例进行索引。

    然后,您可以在搜索时使用字典中的特定键,例如

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

    【讨论】:

      【解决方案2】:

      其实很简单。

      如果“someAttr”和所有其他属性都是简单字段,我认为您不需要映射中的任何特定内容,因此您只需索引数据即可。

      但是,如果您的属性(在“数据”内)是复杂对象,您应该在映射中将“数据”定义为 type : nested。 你可以阅读Nested datatype over here

      【讨论】:

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