2016-12-09 51 views
0

我在elasticsearch上跟蹤事件(我有一個事件類索引),我想包含自定義屬性作爲事件元數據。ElasticSearch索引上的自定義屬性

這些自定義屬性可以由用戶定義,所以我不知道在模型前面。我只知道這將是一個良好的形式Json,並且我將該json作爲字符串存儲在我的事件類中。

我使用C#和巢庫ES工作。

例子:

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

所以我已經是如何存儲這在我彈搜索事件的索引問題?

我想允許用戶搜索/過濾器使用這些自定義屬性的任何事件。

回答

0

您可以定義Data爲您POCO一個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" 
     } 
    } 
    } 
} 

一件事,你NE編輯以知道是否允許任意鍵是在不同文檔中Data中給定鍵的值類型必須相同;有一些可能爲了轉換爲指數類型的組合,但_source仍然會送你什麼。爲避免任何潛在的問題,請對相同的密鑰使用相同的類型。

0

其實它真的很簡單。

如果「someAttr」和所有其他屬性都是簡單的字段,我認爲你不需要任何特定於你的映射的東西,所以你可以索引你的數據。

但是,如果您的屬性(在「數據」內)是複雜的對象,您應該在映射中將「數據」定義爲type : nested。 您可以閱讀Nested datatype over here