[HN Gopher] Implementing HNSW (Hierarchical Navigable Small Worl...
___________________________________________________________________
Implementing HNSW (Hierarchical Navigable Small World) Vector
Search in PHP
Author : centamiv
Score : 76 points
Date : 2026-01-01 15:48 UTC (7 hours ago)
(HTM) web link (centamori.com)
(TXT) w3m dump (centamori.com)
| centamiv wrote:
| OP here. I wrote this implementation to deeply understand the
| mechanics behind HNSW (layers, entry points, neighbor selection)
| without relying on external libraries. While PHP isn't the
| typical choice for vector search engines, I found it surprisingly
| capable for this use case, especially with JIT enabled on PHP
| 8.x. It serves as a drop-in solution for PHP monoliths that need
| semantic search features without adding the complexity of a
| separate service like Qdrant or Pinecone. If you want to jump
| straight to the code, the open-source repo is here:
| https://github.com/centamiv/vektor Happy to answer any questions
| about the implementation details!
| hu3 wrote:
| Great writeup. Thanks for talking the time to organise and
| share.
|
| It's tempting to use this in projects that use PHP.
|
| Is it useable with a corpus of like 1.000 3kb markdown files?
| And 10.000 files?
|
| Can I also index PHP files so that searches include function
| and class names? Perhaps comments?
|
| How much ram and disk memory we would be talking about?
|
| And the speed?
|
| My first goal would to index a PHP project and its
| documentation so that an LLM agent could perform semantic
| search using my MCP tool.
| centamiv wrote:
| I tested it myself with 1k documents (about 1.5M vectors) and
| performance is solid (a few milliseconds per search). I
| haven't run more aggressive benchmarks yet.
|
| Since it only stores the vectors, the actual size of the
| Markdown document is irrelevant; you just need to handle the
| embedding and chunking phases carefully (you can use a parser
| to extract code snippets).
|
| RAM isn't an issue because I aim for random data access as
| much as possible. This avoids saturating PHP, since it wasn't
| exactly built for this kind of workload.
|
| I'm glad you found the article and repo useful! If you use it
| and run into any problems, feel free to open an issue on
| GitHub.
| Random09 wrote:
| The only small thing you forgot to mention - it requires use of
| AI. Open Ai to be specific. I've got baited.
| centamiv wrote:
| Apologies if it felt that way! I used OpenAI in the examples
| just because it's the quickest 'Hello World' for embeddings
| right now, but the library itself is completely agnostic.
|
| HNSW is just the indexing algorithm. It doesn't care where
| the vectors come from. You can generate them using Ollama
| (locally) HuggingFace, Gemini...
|
| As long as you feed it an array of floats, it will index it.
| The dependency on OpenAI is purely in the example code, not
| in the engine logic.
| devmor wrote:
| I think you'd get a lot more people interested in trying
| your project out if you included steps on how to generate
| vectors for the search as a document.
|
| I love PHP, but I will realistically admit that most people
| interested in using PHP probably don't have the experience
| to know how to do such a thing offhand.
| centamiv wrote:
| You are absolutely right. I will update the README with
| some examples, thanks for the feedback!
| lukan wrote:
| Thanks a lot, I liked the fantasy based examples to explain the
| concept.
|
| Programming _is_ chanting magic incarnations and spells after
| all. (And fighting against evil spirits and demons)
| centamiv wrote:
| I'm really glad you liked the article! Thanks so much for
| reading the previous one too, I really appreciate it.
| hilti wrote:
| Great article! I also read your other post and love it! This is
| exactly my thinking: Locality of Behavior (LoB)
|
| Never heard this term before, but I like it.
|
| https://centamori.com/index.php?slug=basics-of-web-developme...
| centamiv wrote:
| Thanks for checking out the other posts too! I wasn't
| familiar with the term 'Locality of Behavior' until recently,
| but it perfectly captures what I strive for: readability and
| simplicity.
| fithisux wrote:
| It makes perfect sense to implement it in a high level language
| that allows understandability.
|
| Very good contribution.
| centamiv wrote:
| Thank you! That was exactly the goal. Modern PHP turned out to
| be surprisingly expressive for this kind of 'executable
| pseudocode'. Glad you appreciated it!
| rvnx wrote:
| Cool blog post, smart guy, very thoughtful and not a copy-paste
| of Python code like 99% of folks. Nice to see
| centamiv wrote:
| Thank you, really appreciate that
___________________________________________________________________
(page generated 2026-01-01 23:00 UTC)