愚者求师之过,智者从师之长。

请问有使用Elasticsearch做 图片搜索引擎的吗?以图搜图那种

Elasticsearch | 作者 | 发布于2019年12月27日 | 阅读数:9368

请问有使用Elasticsearch做 图片搜索引擎的吗?以图搜图那种,类似于百度以图搜图这样的功能。想使用python+Elasticsearch 结合,做一个图片搜索服务
11111.png

 
已邀请:

- Elasticsearch,php

赞同来自: medcl laoyang360 josancpp

商品搜索demo.png

 

Kalasearch

赞同来自: liutianhao

Elastic本身的引擎是Lucene,最开始的设计是一个纯文本full-text search engine
 
Elastic用的query只能是text或某种text的变体(即使是数字之类的其它类型)
 
而以图用图搜的query是图片,那么如果你需要用Elastic来做的话,则需要将图片转为某种形式的text。通常以图搜图的实现是
 
1. 建一个足够大的图片库,将图片特征提取出来(通常结合一些CV的操作,不会仅仅是把像素提取出来)
2. 新来一张图片时,用同样的方法,把特征提取出来
3. 用某种similarity来确定2中的图片和1中的图片距离最近的topK。通常这也可以用一些机器学习的方法来做
 
也就是说,如果你需要用Elastic来做以图搜图,需要比较多hack把一个本来为纯文本设计的引擎(倒排索引)来套用上,这与这个工具本身设计的理念不太切合,所以用起来也会比较尴尬。
 
但如果LZ一定要试试的话,我能想到的办法有
 
1. 自己写一个Query,直接替换ES用的Lucene的标准Query
2. 这个Query需要重新定义一个similarity,比如用余弦距离。在Index时,把图片特征存到index里,存到一个field
3. 对于一个待搜索图片,用同样的方式抽出特征。把其中的特征中的一部分建一个Query,用来搜索第2步里存的field,取5*top-K。注意这里需要比topK多,来保证召回率足够高
4. 对于collect到的所有图片candidate,再将用similarity算一次与query图片的距离,取topK
 
可以看到,这个实在是非常尴尬,倒排引擎的唯一作用就是预过滤,不建议这样使用

medcl - 今晚打老虎。

赞同来自:

Elasticsearch现在已经支持向量检索,将图片特征转换成向量,然后进行相识度检索,已经有用户这么做了。

core_wzw - 某AILab搜索技术负责人

赞同来自:

百万量级以下文档库,自己写个es-embedding-script-score就行,即使是O(n)精确搜索也可以在几十ms内返回TopK结果。
百万量级以上文档库,直接用milvus,milvus支持亿级向量相似计算在毫秒级完成(lg(n)近邻搜索),支持自动增量更新索引,相对FAISS免去Docker化和接口自定义等工作。
 
当年没有写es-embedding插件时,我还试过把embedding转成文本去用match,各种往text变体去靠,太南了..

要回复问题请先登录注册