Python retrieves products and Java decides their order
Upload a product photo or describe what you want, and the application retrieves candidates through CLIP and FAISS. Spring Boot then reads product metadata and a user profile from PostgreSQL before reranking those candidates. A Streamlit interface sends requests to Java. The split is worth studying if your own search prototype has outgrown a notebook and you need to decide which service should own customer data and business rules.
Our checkout was only 0.5 MB, with 80 files and about 2,638 source lines. The small repository is possible partly because the dataset, images, model weights, and index binaries are excluded. It contains application logic and preparation scripts rather than a searchable catalog ready to open. That distinction changes the first afternoon with the project: installing Python dependencies is only the start of assembling something a shopper could use.
What happened when we ran it
Our sandbox installed commit bd87cd0 in 132 seconds, adding 112 packages and using 6,068 MB on disk. The build passed in 4 seconds. Pytest completed in 22 seconds with 6 passed and 0 failed, and pip-audit reported 0 known vulnerabilities. The jump from a small checkout to that installed footprint matters when you prepare a development machine or decide how much space to reserve for an environment.
The October 14, 2026 run used an unprivileged Debian container with 3 CPUs, 8 GB of RAM, Python 3.12, and no secrets. The lab found a tests directory and a Compose file, with no CI workflow files. These checks establish the supplied Python results. They do not establish that PostgreSQL, Java orchestration, generated indexes, and the UI work together, or measure whether shoppers prefer the personalized ranking.
Matching index rows to catalog rows is mandatory
The README instructs you to obtain the fashion dataset separately, validate its images, and generate both text and image indexes in the same row order. A product's machine-learning index ID is its position in the validated CSV. Importing the original unfiltered CSV into Java can therefore break the link between a retrieved vector and the product metadata. Even matching row counts cannot prove that an old index and a reordered catalog correspond.
The 6 passing Python tests are useful evidence of bounded checks, not a substitute for managing that data relationship. The builder refuses to overwrite existing indexes, and the product importer runs only when its table is empty. For an experiment, that makes the data preparation explicit. For a changing store catalog, you need to design how to rebuild and replace indexes alongside database contents without letting search results point at the wrong products.
Personalization has an explanation you can inspect
The ranker combines query similarity with user-vector similarity and metadata preferences, with configurable weights. Likes and other interactions update the profile. Python always returns a product's normalized text catalog vector for profile construction, including after image retrieval, so the representation does not change just because a shopper searched with a photo. That is a concrete design choice worth borrowing when you compare text and image behavior in the same account.
A 112-package environment does not make the ranking evidence stronger than the experiment behind it. The published personalization study uses simulated profiles because the source dataset lacks real interaction history. Relevance also comes from catalog metadata, which favors methods using those attributes. The README states both limits plainly. You can use the experiment to compare code changes, but claims about customer satisfaction or sales would require evidence from actual users.
The complete application needs Java and PostgreSQL
Java 17 is required for the application, and the included Maven Wrapper supplies Maven. The local instructions use Windows terminals for the Python ML service, Spring Boot API, and Streamlit interface. Database credentials and the validated catalog path need configuration. The ML code lazily loads CLIP weights and reports missing indexes through its health response. A running process with a degraded index status is still unable to provide the intended catalog search.
The 132-second install is therefore a narrow setup measurement. It excludes any claimed timing for dataset preparation or catalog embedding, and we have no measured figure for either. The README warns that indexing embeds every description and image and requires internet access for the first model download. It also says the full Compose deployment has not been validated in the development environment. Budget time to verify that route rather than treating the Compose file as proof.
A September push gives limited evidence of ongoing support
GitHub recorded the last push on September 26, 2026, with 67 stars and no open issues or PRs when checked. The latest-release endpoint returned no published release. A quiet issue list does not prove reliability or abandonment, and the recent push argues against calling the project stale. There is simply little public issue activity from which to judge how maintainers handle deployment problems for other users.
I would choose this repository to study an application boundary or run a controlled ranking experiment. Weaviate and Qdrant make more sense if you want a reusable search service and intend to write your own application. Here, the 6,068 MB environment is the first commitment. The adoption decision comes down to whether the explicit Java ranking flow is worth owning the catalog-to-index relationship yourself.

