Show HN: Feep! search, an independent search engine for programmers (search.feep.dev)
Hi HN! This started late last year as an afternoon project to play around with ElasticSearch, and then I kept thinking of new features I wanted to add. I still have a lot of things I want to build, but now seemed like a good time to put it out there: even if the results aren’t nearly the quality I’d like, I’ve still found it useful and I want to show it off!
I’ve been working on it since September 2021, but only in fits and starts. The entire thing runs on a computer in my living room (there’s a picture on the About page); I haven’t done any load testing so we’ll see how it holds up.
73 comments
[ 2.1 ms ] story [ 138 ms ] threadThanks for showing this to us, I like where your head's at!
Edit: found it, it was explained on the front page. https://search.feep.dev/about/datasources
I also have plans to do proper web crawling, though it’ll take me a while to get there: https://search.feep.dev/blog/post/2022-08-10-crawling-roadma...
MDN docs are pretty strong. Perhaps devdocs is a superset, but if not, I’d recommend indexing them as well.
Also, feature request: it’d be nice if the query help unfolded the instructions in-line with the current page instead of navigating to another page. That way, I would be able to see them while mucking with my query.
Thanks for the feature request—I don’t have any frontend JS set up yet that I could easily add this to, but I can see how this could be useful and I’ll put it on my list.
I wonder how many engineers think about search results link origin before clicking through.
I’ve heard enough complaints about W3Schools and other SEO-heavy but accuracy-light sources that I suspect a fair proportion of technically-minded users probably consider the domain before clicking on a result link.
The "predefined subset of the internet" part can definitely be a solution but the preceding "large" is probably where the challenge remains. However, projects like Looria[0] give me hope for a more curated search experience (i.e. without the "large" adjective)
[0] https://www.looria.com/
- the tech has reached a point where it’s actually pretty reasonable for someone to index a fairly large chunk of it themselves: https://search.feep.dev/blog/post/2022-07-23-write-your-own
- benefits of diversification: if one search engine isn’t helpful, you can try another instead of just being out of luck; and spammers now have to game a bunch of different algorithms rather than being able to target just one.
- having just one person, or a small group, focuses the results, and can hopefully produce a higher level of polish in a targeted area.
W.r.t. "and updated intermittently," I wanted to draw your attention to the HN realtime API: https://github.com/HackerNews/API#live-data and also that S.O. offers Atom Feeds: https://stackoverflow.com/feeds/ (I'd guess the rest do, too, but I didn't verify)
I am a huge proponent of taking advantage of any update features that a site offers, because otherwise the "how about now?" of re-crawling is wasteful to both parties.
[1]: e.g. for StackOverflow, I download an XML dump of the entire site once a quarter: https://search.feep.dev/blog/post/2021-09-04-stackexchange
In hindsight, ES wasn’t the best choice for what this turned into: the problem is that it wants to be a managed cluster that does log analysis/analytics/observability/machine learning/I don’t know what all and full text search is almost an afterthought; whereas I want a single node that does full text search and nothing else. All that extra complexity makes it hard for me to figure out how to get it to do what I want, and I don’t have the time to invest in really understanding how it works under the hood. So I probably will switch to something simpler when I get a chance, so I can have a better chance of being able to figure out how to adjust it to make the results look the way I want.
The results are not great, first 2 are links for crystal lang, something about Salesforce, general REST PUT, and the rest are other things not related to Swift or iOS. I would have expected results specifically related to iOS or Swift since those were the technologies I specified.
How should I rephrase this query to end up landing at pages like this: https://stackoverflow.com/questions/29623187/upload-image-wi...
Which is the page that Google took me to, and the one that solved my problem.
I’m currently using ElasticSearch for ranking, and made a brief effort at tuning it. The problem is that it’s very big and complicated, which makes it hard for me to understand what’s going on under the hood. If I were doing this professionally I’d dive into ES internals and figure it out, but when I can only squeeze in a few hours a week it’s hard to really sink my teeth in. I’d like to switch to something simpler to wrap my head around (possibly Lucene, or Bleve); once I’ve done that I should be able to get a better handle on how the ranking works and how to make it more reliable.
The Solr search API is worse, IMHO, also, although it can likely be fine if you just stick to their simple query string (for both versions of "their," ES and Solr). That said, my experience with ES is just like OP's: keeping the piece of junk alive and healthy is a time-and-a-half job. Combined with their recent license tomfoolery, I hope to never touch it again
I haven't used any of the new search upstarts in anger enough to know whether they're prime-time or not
This sort of thing is part of the reason I want to move off of ES: it’s a big black box and when something goes wrong I have no idea how to diagnose it. (I’m currently researching “unassigned shards” in case that’s the problem, but for all I know that could be a red herring.) Something a lot simpler would be easier for me to hold in my head and easier to figure out when it goes wrong.
https://search.feep.dev/about/datasources
Edit: it does appear the the devdocs.io has the docs I'm interested in, but they don't appear to be surfaced in the first several pages of results at least. A good example for this is searching "python datetime" which does not actually return links to datetime docs, just a lot of HN and SO posts referencing datetime.
- The ranking algorithm I’m using isn’t great at distinguishing pages about a topic from pages which merely mention a topic in passing.
- Because the Python docs are versioned, the PageRank they deserve is spread out over several URLs and they appear less relevant than they really are.
I have plans to fix both of these problems, but they’re pretty involved and I haven’t had the time to dig into the matter yet. For the moment, it’s definitely a gamble whether the results will be any good: sometimes they’re great, and other times they’re completely useless. (There’s a reason I put links to other search engines at the bottom of the results page!)
I would use it with the addition mentioned above. Add a newsletter subscription box maybe ?
vs
https://search.feep.dev/search?q=powershell+snipeit
But the results are not even promising, let alone useful, which is very sad.
(I tried "haskell gloss terminate animation normally". That was my real search a couple of days ago.)
On that note: what were you hoping to get out of that search? I see that Gloss is a package for doing animations, but (without knowing anything about Haskell) it seems like Google/DuckDuckGo don’t really have anything useful to offer either. (In fact the only thing I found was what I assume is your post on the Gloss mailing list: https://groups.google.com/g/haskell-gloss/c/FGNxutKmm-w)
Fine tuning result relevance is a pretty long and tedious process, and small problems with this can make results look very bad.
Out of curiousity, what kind of hardware are you running this on? I can imagine that you'd need a lot of storage to store the index, but the size of plain text can often be surprisingly small.
The server is an HP Microserver Gen8 (purchased on eBay), with an “Intel(R) Pentium(R) CPU G2020T @ 2.50GHz” and 16GB of RAM. The production index is 70GB, and I also have a 1TB spinning rust disk that I use for scratch space and raw data.
Ah, that makes a lot of sense actually, thanks for explaining! The heuristics idea sounds neat.
Sounds like it's running on surprisingly little hardware. Is the index stored on a separate SSD?
Modern computers (even ones from 2013) are really fast. I implemented PageRank from the original paper: I have about the same size of index as early Google, and what Page and Brin’s server could compute in a week with carefully optimized C code, mine can do in less than 5 minutes (!) with a bit of JavaScript.
> Is the index stored on a separate SSD?
No, it’s just on the same disk with the rest of the system. My experience has been that pretty much everything that Feep! search does is CPU-bound on this machine; in fact I suspect (though I haven’t tried it) that the index could even be on the HDD and the only difference would be a few extra milliseconds when serving search results.
Could i ask you a question? What is your tech stack? (programing language, background worker, database) How often does the index updates?
Are you planning to make it open source?
Update frequency depends on the data source, details here: https://search.feep.dev/about/datasources
No plans to open-source it at the moment; that implies a level of stewardship that I don’t have the energy for at the moment, and also some of the code is kind of tied to my specific server right now.
Searching for "django signals" got unofficial search results on the first page and all the links on the second page (1) are broken.
Searching for "go cobra" gets no official docs at all.
(1) https://search.feep.dev/search?q=django%20signal&p=2
Some suggestions:
- Prioritize github, gitlab, readthedocs, go.dev, docs.rust links
- In github, only parse readme and wiki links. Avoid parsing links that are related to a specific commit hash.
- Python, Rust docs have versions in the url. Can you link them to the latest version instead ?
People have almost forgotten how bad search indexes were before Google.
All those broken links in your “django signals” seem to have come from a page full of mangled URLs that got picked up on; unfortunately they’ve pushed the actual results all the way down to page 6! I definitely need to give a boost to official documentation.
“golang cobra” gets what appears to be the official repo as the first result; but it’s clearly not really getting what you’re going for here. This is a good example of the sort of challenges a search engine faces: both “go” and “cobra” have multiple meanings, and it needs to understand the context to figure out whether a given link is relevant for this particular search. I think something like a vector search would be useful here but I haven’t looked into setting something like that up yet.
GitHub is on my list, but it’s very big and is going to require careful optimization. (Even if I only load top-level READMEs it’s still a ton of data.)
ReadTheDocs would be great, but they don’t seem to have any dump/download support, or even a list of all the documentation sites they host, so in lieu of that they’re going to have to wait until I get a general web crawler.
I have some heuristics to collapse multiple versions into single result with a version picker, but they require some adjustments to the rest of my data processing pipeline which I haven’t gotten round to yet.
- Google, StartPage
- Bing, DuckDuckGo, Ecosia, AOL, Yahoo
- Yandex (mainly Russian)
- Brave (recently started its own index but often falls back on Google's)
Love to see projects like Marginalia and now this. These projects also make meta search engines like Searx[0] that much more powerful.
Anyways since I'm in the business of listing out relevant projects, other code-centered search engines you might wanna check out are searchcode.com[1], codesearch.ai[2], symbolhound[3], and publicwww.com[4] (some of these are often down, but might still be good to learn from)
[0] https://searx.tuxcloud.net/
[1] https://searchcode.com/
[2] https://codesearch.ai/
[3] http://symbolhound.com/
[4] https://publicwww.com/
EDIT: Tough crowd, did Kagi get cancelled or something while I wasn't looking?
For example, take this search :
https://kagi.com/search?q=steve+jobs&r=us&sh=OP2gxAxk3KEV_jM...
60% of results you see are coming from our own index. For most queries it is 10-30%. If you use the 'Non-commercial' filter this number may go up to 100% (because our index focus on non-commercial part of the web).
• http://codesearch.debian.net/
• https://codesearch.isocpp.org/
• https://www.programcreek.com/python/
• https://livegrep.com/search/linux
• https://grep.app/
- https://www.thecodingforums.com/ (and other programming-related online communities like Lobste.rs, certain subreddits, and certain Lemmy instances/communities)
- https://pldb.com/ (might be a good way to automatically get all the docs of each programming language as well as books/videos/publications that mention a certain language)
Looked for "reject!" and it returned "reject" and "rejection" when "reject!" matches exist. Ironic given its name.
I think the main problem here is that my index is relatively small: it has only (!) 30 million pages, and it looks like Braze just isn’t popular enough for me to have run into it with the right keywords yet.
Aside: Maybe I’m too paranoid, but I wouldn’t show a pic of my specific modem and router models.
I think I’m way ahead of you on the paranoia: both the router and the Ethernet switch you see are actually behind the NAT (the router is just serving as a WiFi AP), so you’d have to already be on the LAN to get at them. (Also, my devices all treat the network as an untrusted public one anyway, so even if someone did decide to target me specifically there’s not much extra they could do even if they did get access.)