主頁 >  其他 > Elasticsearch:消除 Elasticsearch 中的重復資料

Elasticsearch:消除 Elasticsearch 中的重復資料

2021-04-08 11:12:21 其他

重復資料在資料分析和搜索中會造成錯誤,在我們的實際使用中,我們應該避免重復匯入的資料,重復資料有各種原因會造成,比如我們重復匯入同樣的資料,當我們寫入檔案時使用自動生成的 ID,那么同樣的檔案被匯入兩次,這樣會造成同樣的兩個一樣的檔案會保存于 Elasticsearch 中盡管它們的 ID 會有不同,在我之前的文章 “Beats:如何避免重復的匯入資料”,我詳細描述了如果使用 Beats 匯入資料時,避免重復資料,

避免在 Elasticsearch 索引中重復始終是一件好事, 但是,通過消除重復項,你可以獲得其他好處:節省磁盤空間,提高搜索準確性,提高硬體資源管理效率, 也許最重要的是,你減少了搜索的獲取時間,令人驚訝的是,有關該主題的檔案很少,因此我們提供了本教程,為你提供識別和管理索引中重復項的適當技術,

示例資料

這里有四個簡單的檔案,其中一個是另一個的重復資料, 我們建立一個叫做 employeeid 的索引,

POST employeeid/_bulk
{ "index" : { "_id" : "1" } }
{ "name" : "John", "organisation": "Apple", "employeeID": "23141A"}
{ "index" : { "_id" : "2" } }
{ "name" : "Sam", "organisation": "Tesla", "employeeID": "TE9829"}
{ "index" : { "_id" : "3" } }
{ "name" : "Sarah", "organisation": "Microsoft", "employeeID": "M54667"}
{ "index" : { "_id" : "4" } }
{ "name" : "John", "organisation": "Apple", "employeeID": "23141A"}

從上面的命令中,我們可以看得出來 ID 為 1 和 4 的兩個檔案完全是一樣的,盡管它們的 ID 是不同的,

資料匯入程序中避免重復檔案

在考慮如何在 Elasticsearch 中執行重復檢查之前,讓我們花點時間考慮一下不同型別的索引方案,

一種情況是在索引編制之前我們可以訪問源檔案, 在這種情況下,檢查資料并查找一個或多個包含唯一值的欄位相對容易, 也就是說,該欄位的每個不同值僅出現在一個檔案中, 在這種情況下,我們可以將該特定欄位設定為 Elasticsearch 索引的檔案 ID, 由于任何重復的源檔案也將具有相同的檔案 ID,因此 Elasticsearch 將確保這些重復檔案不會成為索引的一部分,

你可以參考我之前的文章 “Beats:如何避免重復的匯入資料”,

Upsert

另一種情況是一個或多個檔案具有相同的識別符號但內容不同, 當用戶編輯檔案并想使用相同的檔案 ID 重新索引該檔案時,通常會發生這種情況, 問題在于,當用戶嘗試重新索引時,Elasticsearch 不允許這樣做,因為它的檔案 ID 必須是唯一的,

解決方法是使用 Upsert API, Upsert 檢查特定檔案的存在,如果存在,Upsert 將使用 Upsert 的內容更新該檔案, 如果檔案不存在,Upsert 將創建具有相同內容的檔案, 無論哪種方式,用戶都將在相同的檔案 ID 下獲得內容更新,

在第三種情況下,在創建索引之前無法訪問資料集, 在這些情況下,我們將需要搜索索引并檢查重復項, 這就是我們在以下各節中演示的內容,

在寫入資料時,我們可以使用 Upsert 來進行,如果該檔案尚不存在,則將 Upsert 元素的內容作為新檔案插入, 如果檔案存在,則執行更新,比如:

POST test/_update/1
{
  "script": {
    "source": "ctx._source.counter += params.count",
    "lang": "painless",
    "params": {
      "count": 4
    }
  },
  "upsert": {
    "counter": 1
  }
}

在上面,如果 ID 為 1 的檔案已經存在沒那么將執行腳本,并把 count 的值加上 4,否則創建一個新的檔案,并把 count 欄位的值設定為 1,又比如:

POST sessions/_update/dh3sgudg8gsrgl
{
  "scripted_upsert": true,
  "script": {
    "id": "my_web_session_summariser",
    "params": {
      "pageViewEvent": {
        "url": "foo.com/bar",
        "response": 404,
        "time": "2014-01-01 12:32"
      }
    }
  },
  "upsert": {}
}

在上面,我們設定 scrpted_upsert 為 true,無論 ID 為 dh3sgudg8gsrgl 已經存在與否,id 為 my_web_session_summariser 的腳本將被執行,并把相應的引數傳入,

我們也可以直接使用 _update 對檔案直接更新,比如:

POST test/_update/1
{
  "doc": {
    "name": "new_name"
  },
  "doc_as_upsert": true
}

在上面,如果 ID 為 1 的檔案已經存在,那么它的欄位 name 值將被更新,否則創建一個新的 ID 為 1 的檔案,并設定它的欄位 name 值為 new_name,

在使用 Upsert 命令時,我們需要注意的是:我們必須提供一個 ID,另外它有兩個操作:檢查是否存在,并更新或者寫入,Upsert 的速度會比正常的自動生成 ID 的匯入速度慢,

當我們使用 Logstash 進行匯入時,我們也可以指定 Upsert,

檢查重復項的基本技巧

在上面的每個示例檔案中,我們看到三個欄位:name,organisation 及 employeeID,并且如果我們假設 name 欄位是唯一的,則可以將該欄位指定為檢查重復項的識別符號, 如果多個檔案的 name 欄位具有相同的值,則該檔案確實是重復的,

遵循此基本原理,我們可以執行簡單的術語聚合,以獲取 name 欄位每個值的檔案計數, 但是,這種簡單的聚合只會回傳該欄位每個值下的檔案計數, 這種方法在檢查重復項時沒有用,因為我們要檢查檔案中該欄位的一個或多個值的重復項, 為此,我們還需要應用 top_hits 聚合 - 一個子聚合器,其中每個存盤桶中均會聚合最匹配的檔案,

這是我們建議針對上面給出的示例檔案索引的查詢:

GET employeeid/_search
{
  "size": 0,
  "aggs": {
    "duplicateCount": {
      "terms": {
        "field": "name.keyword",
        "min_doc_count": 2
      },
      "aggs": {
        "duplicateDocuments": {
          "top_hits": {}
        }
      }
    }
  }
}

在這里,我們定義引數 min_doc_count,通過將此引數設定為 2,只有 doc_count 為 2 或更大的聚合桶將出現在聚合中(如以下結果所示),

上面的命令運行的結果是:

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 4,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "duplicateCount" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "John",
          "doc_count" : 2,
          "duplicateDocuments" : {
            "hits" : {
              "total" : {
                "value" : 2,
                "relation" : "eq"
              },
              "max_score" : 1.0,
              "hits" : [
                {
                  "_index" : "employeeid",
                  "_type" : "_doc",
                  "_id" : "1",
                  "_score" : 1.0,
                  "_source" : {
                    "name" : "John",
                    "organisation" : "Apple",
                    "employeeID" : "23141A"
                  }
                },
                {
                  "_index" : "employeeid",
                  "_type" : "_doc",
                  "_id" : "4",
                  "_score" : 1.0,
                  "_source" : {
                    "name" : "John",
                    "organisation" : "Apple",
                    "employeeID" : "23141A"
                  }
                }
              ]
            }
          }
        }
      ]
    }
  }
}

請務必注意,我們必須將 min_doc_count 的值設定為2, 否則,其他結果將出現在聚合中,并且我們將找不到可能存在的任何重復項,

對多個欄位中的值進行重復資料洗掉

我們上面所做的是一個非常基本的示例,該示例根據單個欄位中的值來標識重復檔案,這不是很有趣,還是有用的,在大多數情況下,檢查重復項需要檢查多個欄位,我們不能可靠地假設員工檔案之間存在重復項,而這些重復項僅在名稱欄位中包含多次出現的 “Bill” 值,在許多實際情況下,有必要檢查許多不同欄位之間的重復項,考慮到上面的示例資料集,我們需要檢查所有欄位中的重復項,

我們可以從上一節中擴展我們的方法,并執行多欄位術語聚合和 top-hits 聚合,我們可以對索引檔案中的所有三個欄位進行術語聚合,我們將再次指定 min_doc_count 引數,以僅獲取 doc_count 大于或等于 2 的存盤桶,我們還應用 top_hits 聚合以獲取正確的結果,為了容納多個欄位,我們使用腳本來幫助我們追加欄位值以在聚合中顯示:

GET employeeid/_search
{
  "size": 0,
  "aggs": {
    "duplicateCount": {
      "terms": {
        "script": "doc['name.keyword'].value + doc['employeeID.keyword'].value + doc['organisation.keyword'].value",
        "min_doc_count": 2
      },
      "aggs": {
        "duplicateDocuments": {
          "top_hits": {}
        }
      }
    }
  }
}

如下所示,運行此查詢的結果將顯示一個重復計數聚合,聚合 duplicateDocuments 包含在其中找到重復值的檔案, 我們可以對這些檔案進行交叉檢查和驗證,

{
  "took" : 3,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 4,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "duplicateCount" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "John23141AApple",
          "doc_count" : 2,
          "duplicateDocuments" : {
            "hits" : {
              "total" : {
                "value" : 2,
                "relation" : "eq"
              },
              "max_score" : 1.0,
              "hits" : [
                {
                  "_index" : "employeeid",
                  "_type" : "_doc",
                  "_id" : "1",
                  "_score" : 1.0,
                  "_source" : {
                    "name" : "John",
                    "organisation" : "Apple",
                    "employeeID" : "23141A"
                  }
                },
                {
                  "_index" : "employeeid",
                  "_type" : "_doc",
                  "_id" : "4",
                  "_score" : 1.0,
                  "_source" : {
                    "name" : "John",
                    "organisation" : "Apple",
                    "employeeID" : "23141A"
                  }
                }
              ]
            }
          }
        }
      ]
    }
  }
}

從上面,我們可以看出來有一個重復的檔案,

假如我們把匯入的檔案修改為:

POST employeeid/_bulk
{ "index" : { "_id" : "1" } }
{ "name" : "John", "organisation": "Apple", "employeeID": "23141A"}
{ "index" : { "_id" : "2" } }
{ "name" : "Sam", "organisation": "Tesla", "employeeID": "TE9829"}
{ "index" : { "_id" : "3" } }
{ "name" : "Sarah", "organisation": "Microsoft", "employeeID": "M54667"}
{ "index" : { "_id" : "4" } }
{ "name" : "John", "organisation": "Apple", "employeeID": "23141A"}
{ "index" : { "_id" : "5" } }
{ "name" : "Sarah", "organisation": "Microsoft", "employeeID": "M54667"}

在上面,ID 為 1 和 4 為重復檔案,3 和 5 的檔案為重復檔案,重新運行上面的查詢,我們可以看到:

  "aggregations" : {
    "duplicateCount" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "John23141AApple",
          "doc_count" : 2,
          "duplicateDocuments" : {
            "hits" : {
              "total" : {
                "value" : 2,
                "relation" : "eq"
              },
              "max_score" : 1.0,
              "hits" : [
                {
                  "_index" : "employeeid",
                  "_type" : "_doc",
                  "_id" : "1",
                  "_score" : 1.0,
                  "_source" : {
                    "name" : "John",
                    "organisation" : "Apple",
                    "employeeID" : "23141A"
                  }
                },
                {
                  "_index" : "employeeid",
                  "_type" : "_doc",
                  "_id" : "4",
                  "_score" : 1.0,
                  "_source" : {
                    "name" : "John",
                    "organisation" : "Apple",
                    "employeeID" : "23141A"
                  }
                }
              ]
            }
          }
        },
        {
          "key" : "SarahM54667Microsoft",
          "doc_count" : 2,
          "duplicateDocuments" : {
            "hits" : {
              "total" : {
                "value" : 2,
                "relation" : "eq"
              },
              "max_score" : 1.0,
              "hits" : [
                {
                  "_index" : "employeeid",
                  "_type" : "_doc",
                  "_id" : "3",
                  "_score" : 1.0,
                  "_source" : {
                    "name" : "Sarah",
                    "organisation" : "Microsoft",
                    "employeeID" : "M54667"
                  }
                },
                {
                  "_index" : "employeeid",
                  "_type" : "_doc",
                  "_id" : "5",
                  "_score" : 1.0,
                  "_source" : {
                    "name" : "Sarah",
                    "organisation" : "Microsoft",
                    "employeeID" : "M54667"
                  }
                }
              ]
            }
          }
        }
      ]
    }
  }

如上所示,重復的檔案都被顯示出來了,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/273684.html

標籤:其他

上一篇:【ElasticSearch入門】Windows下ElasticSearch、Head安裝及分布式集群搭建

下一篇:Linux下kafka入門基礎:啟動、生產與消費

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more