c# - ElasticSearch 索引上的自定义属性

标签 c# elasticsearch nest

我在 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/

相关文章:

elasticsearch - 如何通过Java API从ElasticSearch删除数据

elasticsearch - ElasticSearch映射:是否可以自动截断日期以适合其格式?

elasticsearch - 通过 Fluent Api 在 Elastic Search/NEST 2.0 中设置 Id 字段

c# - 通过Nest中的SearchRequest类设置索引名称

C# winforms : graphics. DrawImage 问题

c# - 如何将方法限制为 n 个并发调用

c# - 抑制 Visual Studio 2015 中的特定分析错误

c# 静态构造函数不是从派生类调用的

mysql - 将包含 LONGTEXT 字段的 MySQL 表索引到 Elastic Search 中

elasticsearch - 如何获得多个记录?