ElasticSearch 圖片搜尋外掛 (一)
一, 關於ElasticSearch
ElasticSearch 是基於 Lucene 的分散式搜尋引擎。 雖然Lucene 從 版本6 開始內部使用了bkd樹使得多維搜尋問題得到顯著優化,但是 ElasticSearch 實際只在 numeric range 問題上使用了bkd樹。
二,官方的圖片搜尋外掛
官方網頁地址: https://www.elastic.co/blog/found-getting-started-with-lire-and-elasticsearch
該專案年久失修,正式發行版本只支援到ElasticSearch 1.0.1 ,readme也不能正常使用,而官方網頁上介紹的上傳圖片是程式設計實現的,不利於嘗試。所以下面介紹的使用步驟也是我一點點摸索出來的。
1,下載 ElasticSearch 1.0.1, 解壓,cd到目錄,執行 ./bin/plugin -install com.github.kzwang/elasticsearch-image/1.2.0安裝外掛。
2,執行./bin/elasticsearch啟動伺服器。
3,建立節點——開啟cmd視窗,執行命令:
curl -XPOST 'https://localhost:9200/images' -d '{ "settings" : { "number_of_shards" : 3 }, "mappings" :{ "image": { "properties": { "name": { "type": "string" }, "image": { "type": "image", "feature": { "CEDD": { "hash": "BIT_SAMPLING" }, "JCD": { "hash": ["BIT_SAMPLING", "LSH"] }, "FCTH": {} } } } }}}'
4,上傳圖片——執行命令:
curl -XPOST 'https://localhost:9200/images/image' -d '{ "name":"<圖片名字>", "image":"<圖片的base64編碼>"}'
其中<圖片名字>替換成圖片的名字。
其中<圖片的base64編碼>替換成某張圖片的base64編碼,網上有很多線上工具可以用,比如“http://base64image.org/”。
可以多上傳幾張圖片來測試搜尋效果。
5,搜尋——執行命令:
curl -XPOST 'https://localhost:9200/images/_search' -d '{"fields":["name"],"query":{"image":{"image":{"feature":"CEDD","image":"<要搜的圖片的base64編碼>","hash":"BIT_SAMPLING","limit":10}}}}'
其中<要搜的圖片的base64編碼>替換成要搜尋的那張圖片的base64編碼。
以上3/4/5步也可以不使用curl,藉助於ElasticSearch的另一個核心外掛head中的複合查詢介面與伺服器通訊。head的安裝命令是
./bin/elasticsearch-plugin install mobz/elasticsearch-head
上面幾步執行完就可以看到搜尋結果類似這張截圖:
三,官方的圖片搜尋外掛只支援到1.0.1,而ElasticSearch 版本目前已經到了6。網上已經有幾個支援ElasticSeach 5 以上版本的圖片搜尋外掛專案,比如這個基於tensorflow的https://github.com/tuan3w/visual_search。ES 版本5和6也有一些區別,ES 6中 script 需要繼承的類是 SearchScript。
四,使用 es 做相似圖片搜尋在速度上並不理想,總是要將所有文件做一個評分才能得出最相似的那個。