2017-04-06 48 views
2

我有两套单指数哈希与不同的标签像下面的附加字段:elasticsearch骨料独特条目,并找到所有标签

指数:hashes- *

sha1-c   tag 
abcdefg12345  collect 
abcdefg12345  collect 
bcdefgh12345  collect 
cdefghi   collect 


sha1-m  tag 
abclefg  bad 
abcgefg  bad 
cdefghi  bad 

如何我可以在索引中找到两个标签之间的所有重复项吗?我更喜欢kibana中的数据表或可视化,但弹性搜索聚合/查询就足够了。

FORMAT

t _index  sha1-c 
t _type  sha1-c 
t sha1-c  cdefghi 
t tag  sha1-c 

t _index  sha1-m 
t _type  sha1-m 
t sha1-m  cdefghi 
t tag  sha1-m 

预计最终状态:

所有的
hash_matches 
cdefghi 
+0

这两个不同的领域? 'sha1-c'和'sha1-m' –

+0

查看上面的表 – johnnyb

+0

查看上面所以,你有两个不同的索引?你有点想加入他们(如在内部联接)? –

回答

2

首先,重要的是你的两个指数具有相同的字段名。另外,为了简单起见,tagsha-1c字段应该有一个子字段(或它们自己)应该是keyword s,以便terms聚合不会在某些错误分析的文本上发生跳动。

这是我的建议(测试5.3)。在2.x中,可能需要稍微更改脚本。在1.x中,此解决方案将无法工作,因为没有可用的管道聚合。

该解决方案基本上创建一个terms聚合sha值,然后为每个沙它计数它找到的不同标签。如果这些标签的数量高于两个,那么就有两个标签。现在,如果我们知道,如果在每个索引中只发现一次sha值,那将是一个更稳固的解决方案。它是这样吗?如果是这样,下面的tag字段上的聚合应该被转换为字段上的聚合。

DELETE sha1-* 
PUT sha1-c 
{ 
    "mappings": { 
    "sha1-c": { 
     "properties": { 
     "sha1-c": { 
      "type": "keyword" 
     }, 
     "tag": { 
      "type": "keyword" 
     } 
     } 
    } 
    } 
} 
PUT sha1-m 
{ 
    "mappings": { 
    "sha1-m": { 
     "properties": { 
     "sha1-c": { 
      "type": "keyword" 
     }, 
     "tag": { 
      "type": "keyword" 
     } 
     } 
    } 
    } 
} 

POST /sha1-c/sha1-c/_bulk 
{"index":{}} 
{"sha1-c":"abcdefg12345","tag":"collect"} 
{"index":{}} 
{"sha1-c":"abcdefg12345","tag":"collect"} 
{"index":{}} 
{"sha1-c":"bcdefgh12345","tag":"collect"} 
{"index":{}} 
{"sha1-c":"cdefghi","tag":"collect"} 

POST /sha1-m/sha1-m/_bulk 
{"index":{}} 
{"sha1-c":"abclefg","tag":"bad"} 
{"index":{}} 
{"sha1-c":"abcgefg","tag":"bad"} 
{"index":{}} 
{"sha1-c":"cdefghi","tag":"bad"} 


GET /sha1-*/_search 
{ 
    "size": 0, 
    "aggs": { 
    "myField": { 
     "terms": { 
     "field": "sha1-c" 
     }, 
     "aggs": { 
     "count_tags": { 
      "cardinality": { 
      "field": "tag" 
      } 
     }, 
     "values_bucket_filter_by_tags_count": { 
      "bucket_selector": { 
      "buckets_path": { 
       "count": "count_tags" 
      }, 
      "script": "params.count >= 2" 
      } 
     } 
     } 
    } 
    } 
} 
+0

今天要测试这个,谢谢你的帮助。 – johnnyb