elasticsearch 在Elasticsearch中处理重复记录,elasticsearch,logstash,elastic-stack,elasticsearch,Logstash,Elastic Stack" /> elasticsearch 在Elasticsearch中处理重复记录,elasticsearch,logstash,elastic-stack,elasticsearch,Logstash,Elastic Stack" />

elasticsearch 在Elasticsearch中处理重复记录

elasticsearch 在Elasticsearch中处理重复记录,elasticsearch,logstash,elastic-stack,elasticsearch,Logstash,Elastic Stack,我正在使用Hadoop+ELK堆栈构建一个分析堆栈。我正在尝试每天刷新索引 我正在使用CSV格式的第三方数据。我无法控制输入数据,即我无法要求更改CSV文件的架构 问题是CSV记录中没有唯一的id,甚至组合列以生成唯一id也不起作用。因此,在刷新Elasticsearch时,会将重复数据添加到索引中 所以,如果第1天的数据是 Product1,Language1,Date1,$1 Product2,Language2,Date1,$12 第2天数据变为 Product1,Language1,D

我正在使用Hadoop+ELK堆栈构建一个分析堆栈。我正在尝试每天刷新索引

我正在使用CSV格式的第三方数据。我无法控制输入数据,即我无法要求更改CSV文件的架构

问题是CSV记录中没有唯一的id,甚至组合列以生成唯一id也不起作用。因此,在刷新Elasticsearch时,会将重复数据添加到索引中

所以,如果第1天的数据是

Product1,Language1,Date1,$1
Product2,Language2,Date1,$12
第2天数据变为

Product1,Language1,Date1,$1
Product2,Language2,Date1,$12
Product1,Language1,Date1,$1
Product2,Language2,Date1,$12
Product3,Language1,Date2,$5(new record added on day2)

在ELK中有什么好方法来处理这个问题吗?我正在使用Logstash来使用csv文件。

我想这都是关于文档“\u id”的问题

如果每个文档都有一个唯一的“_id”,那么就不会有问题,因为您只需将文档“更新”为相同的值。如果需要,您甚至可以将映射设置为不允许更新

您的问题是您没有将文档的“\u id”链接到文档的内容(在某些情况下,这很好)

我想一个简单的解决方案是创建您自己的“my_id”字段并设置“_id”的路径,如

接下来的问题是如何创建“我的id”字段。我会在文件上使用哈希

它的一个示例python代码片段是(我相信您可以找到合适的ruby插件):


我想这都是关于文件“\u id”

如果每个文档都有一个唯一的“_id”,那么就不会有问题,因为您只需将文档“更新”为相同的值。如果需要,您甚至可以将映射设置为不允许更新

您的问题是您没有将文档的“\u id”链接到文档的内容(在某些情况下,这很好)

我想一个简单的解决方案是创建您自己的“my_id”字段并设置“_id”的路径,如

接下来的问题是如何创建“我的id”字段。我会在文件上使用哈希

它的一个示例python代码片段是(我相信您可以找到合适的ruby插件):


我想这都是关于文件“\u id”

如果每个文档都有一个唯一的“_id”,那么就不会有问题,因为您只需将文档“更新”为相同的值。如果需要,您甚至可以将映射设置为不允许更新

您的问题是您没有将文档的“\u id”链接到文档的内容(在某些情况下,这很好)

我想一个简单的解决方案是创建您自己的“my_id”字段并设置“_id”的路径,如

接下来的问题是如何创建“我的id”字段。我会在文件上使用哈希

它的一个示例python代码片段是(我相信您可以找到合适的ruby插件):


我想这都是关于文件“\u id”

如果每个文档都有一个唯一的“_id”,那么就不会有问题,因为您只需将文档“更新”为相同的值。如果需要,您甚至可以将映射设置为不允许更新

您的问题是您没有将文档的“\u id”链接到文档的内容(在某些情况下,这很好)

我想一个简单的解决方案是创建您自己的“my_id”字段并设置“_id”的路径,如

接下来的问题是如何创建“我的id”字段。我会在文件上使用哈希

它的一个示例python代码片段是(我相信您可以找到合适的ruby插件):


我相信解决方案的第一部分是确定一组值,如果一起使用,这些值对于文档来说是唯一的。如果没有,那么就没有办法将复制文件与真实文件区分开来。 为了便于讨论,假设四个值(Product1、Language1、Date1、$1)定义了一个文档。如果有另一个文档具有相同的设置值,则它是前一个文档的副本,而不是新文档

假设您有(Product1,Language1,Date1,$1),您可以首先执行一个查询,搜索该文档是否已经存在于ElasticSearch中。比如:

{
"filter": {
    "bool": {
        "must": [
            {
                "term": {
                    "pdtField": "Product1"
                }
            },
            {
                "term": {
                    "langField": "Language1"
                }
            },
            {
                "term": {
                    "dateField": "Date1"
                }
            },
            {
                "term": {
                    "costField": "$1"
                }
            }
        ]
    }
}
}
根据实际使用的内容,注意此处使用的字段的名称。 如果此筛选结果具有
doc\u count!=0
则无需为此创建新文档。否则,创建一个新文档,其中包含手头的值

或者,您可以使用由(Product1,Language1,Date1,$1)创建的散列创建文档ID,然后将此散列用作文档的_ID。首先检查是否存在具有此id的文档。如果它不存在,则创建一个新文档,其中的值与哈希生成的_id值相对应


如果您无法控制创建单个文档的方式,那么您可以尝试使用上面建议的策略预处理CSV输入,只在CSV中保留所需的条目,而不使用其他条目,然后像往常一样携带生成的CSV。

我相信解决方案的第一部分将是识别一组值,如果一起使用,这些值对于文档来说是唯一的。如果没有,那么就没有办法将复制文件与真实文件区分开来。 为了便于讨论,假设四个值(Product1、Language1、Date1、$1)定义了一个文档。如果有另一个文档具有相同的设置值,则它是前一个文档的副本,而不是新文档

假设您有(Product1,Language1,Date1,$1),您可以首先执行一个查询,搜索该文档是否已经存在于ElasticSearch中。比如:

{
"filter": {
    "bool": {
        "must": [
            {
                "term": {
                    "pdtField": "Product1"
                }
            },
            {
                "term": {
                    "langField": "Language1"
                }
            },
            {
                "term": {
                    "dateField": "Date1"
                }
            },
            {
                "term": {
                    "costField": "$1"
                }
            }
        ]
    }
}
}
根据实际使用的内容,注意此处使用的字段的名称。 如果此筛选结果具有
doc\u count!=0
则无需为此创建新文档。否则,创建一个新文档,其中包含手头的值

或者,您可以使用由(Product1,Language1,Date1,$1)创建的散列创建文档ID,然后将此散列用作文档的_ID。首先检查是否有