elasticsearch模糊查询图片与文件
0x1 目标
需求是可以在亿级文件或图片中, 快速找到相似的图片或文件
0x2 解决方案
中间尝试过不少方案, 这里就说一下最后测试可行的方案
1 | 图片模糊查询: 使用image-match, 这个工程是自己实现的汉明矩阵数据储存和查询, 之前有使用插件形式去解析汉明hash, 但是数据量太大查询太慢, 所以使用了这个方案, 使用空间换时间 |
1 | 文件模糊查询: 文件模糊查询使用的ssdeep模糊hash算法 |
0x3 在es中使用image-match
以下是测试用例, 详细的用法也说了, 有独特的订制需求可以在elasticsearch_driver.py和signature_database_base.py文件中修改
1 | import os |
0x4 在es中查询ssdeep
1 | ssdeep哈希的格式如下: |
但是比较ssdeep的方式, 只能调用ssdeep库的compare函数去比较相似度, 但用在es中, 只能使用写插件的形式, 之前也说了, 在图标模糊搜索的时候尝试过使用插件来搜索结果, 结果是太慢了, 所以这里采用了几个办法去过滤搜索结果
1 | 1. 过滤hash中chunksize相同的 |
具体实现的核心代码:
1 | ## es 5.x 创建分词器的, 动态mapping |
0x5 结语
以上就是粗略的记录了此次解决方案的思路, 可能细节还有遗漏, 或者有更好的解决方案可以留言或加V一起交流^-^