Our client for this project was an image licensing service with a large image library. We are not able to share the company name, but they own or have licensed the rights to a massive collection of images, mostly in the fine arts space: paintings, sculpture, vintage photography, etc. They have agreements with museums and art galleries all over the world to be a sort of digital clearinghouse on behalf of the rights holders for the artwork. They provide all this content in a searchable database, and creators who want to showcase these images in their own websites, books, videos, etc. can easily find what they need and pay a modest licensing fee for the rights to use the image, rather than wasting time tracking down all the artists, sculptors, photographers, and rights holders themselves. Because the licensing is all taken care of, the creator can rest easy, without fear of any copyright claims.
While the client already had an advanced search functionality on their website, to help users discover the images they needed, it was keyword-based. You could easily search by the title of the piece or the original creator, but if you didn’t have that information, finding just what you want in such a vast library could be daunting.
The client wanted to provide their users with a reverse image search, allowing them to use one image to search for other similar ones. That way if users already had an image they wanted to use or an image that resembled what they wanted, they could simply upload the image to the search, and find similar entries in the image database, ready to be licensed and used.
The client’s existing application was built with jQuery, PHP, MySQL, Amazon RDS, and Symfony 3. The image library search was built on top of ElasticSearch. The system was architected as a series of microservices, each running in Docker containers, managed with Docker Compose.
They had selected a web service with a REST API that could provide this capability, provided by TinEye, but they needed someone to integrate it with their existing web infrastructure.
They had a backend API built in Symfony 3, which used a microservices architecture, where each service was provided by separate Docker containers. Meanwhile, their front end was built in old-school jQuery.
We built a new microservice to serve to interact with the TinEye API and optimized the ElasticSearch features.
We added a form to drag and drop images in the search bar.
You upload the image on the form. That gets sent to a microservice wrapping TinEye which is responsible for processing the image.
We have indexed the image database in TinEye, so it can have something to search for. TinEye will return a JSON result set, which we then passed to ElasticSearch to be filtered some more.
We built a service to send images from the client’s image database to TinEye to be indexed. We built a UI for the image search to allow easy drag-and-drop upload of image samples and clean presentation of results. We integrated with their existing search functionality, built on top of ElasticSearch, including filters by color, size, format, age, etc., text-based searching. So a user could search by image and apply additional filters to further narrow their search.
We built the UI for the image search, and a microservice to wrap the TinEye API, provide the image search capabilities, and then provide the results.
We provided a solution that allowed the client’s users to search the image database using their own sample images, making it much more convenient for them to quickly find exactly the images they need. The solution integrated seamlessly with the existing search functionality (text search, filters, etc.), to present a unified search interface for users and an excellent user experience.