[HN Gopher] Static Sites with Elasticsearch
       ___________________________________________________________________
        
       Static Sites with Elasticsearch
        
       Author : amitaibu
       Score  : 34 points
       Date   : 2020-05-02 17:58 UTC (5 hours ago)
        
 (HTM) web link (www.gizra.com)
 (TXT) w3m dump (www.gizra.com)
        
       | arkadiyt wrote:
       | Philosophically building website search on top of Elasticsearch
       | seems fine, but don't call it a static site then - you're
       | deploying a backend.
       | 
       | "Static site search" to me is something like adding a `<form
       | action="https://duckduckgo.com" method="get">` text box to your
       | site.
        
         | juriansluiman wrote:
         | Yes. I have a Google Custom Search engine which I dispatch via
         | javascript. It just displays the results formatted from a json
         | list. It is just a matter of preference, since DDG can't
         | integrate search with an API as far as I know.
        
         | amitaibu wrote:
         | @arkadiyt Thanks - I see your point. However, I believe you can
         | also think about it as a service - similar to how Disqus can be
         | added to your static site. That is, the site is static, but the
         | results for the search are handled with a service. In this case
         | the "service" - Elasticsearch - is tightly coupled to your
         | static site's revision.
        
           | turnipla wrote:
           | You're confusing static with serverless.
           | 
           | Your content is indeed static but your search is not: It's
           | handled by a service that parses your requests and produces
           | output.
           | 
           | Static content on the other hand are files being served
           | straight from the filesystem.
           | 
           | As for Disqus, they're not static either, they're just "a
           | service for static websites"
        
             | amitaibu wrote:
             | @turnipla Indeed, the Elasticsearch is completely a typical
             | request - response kind. However, the point in the post was
             | showing how we could make sure the search is in full sync
             | with static site - even if we for example rolled-back
             | deploys. That is, even if we rollback to a revision with
             | less content than what we have in the "default" index,
             | search will not show it to us.
        
       | simonw wrote:
       | I've been experimenting with SQLite FTS as a way of adding search
       | to an otherwise static site.
       | 
       | The big advantage of SQLite FTS is that it's really cheap to run.
       | The index is a single static file on disk, then you add a Python
       | process (I'm using https://github.com/simonw/datasette ) to run
       | queries against it. Much less resource intensive than running
       | Solr or Elasticsearch.
       | 
       | It also works surprisingly well - I've run FTS queries against
       | tables that are up to around 10GB on disk and performance is
       | great.
       | 
       | It's no way near as featureful as Lucene, but for small to medium
       | sized projects it's easily good enough.
       | 
       | As for deployment: if the SQLite .db index file is small enough
       | you can bundle it up as part of a static deployment, e.g. bundled
       | in a Docker container. I've done this using Heroku, Google Cloud
       | Run, https://fly.io/ and Zeit Now (aka Vercel).
       | 
       | If the content lives in a git repository you can hook up CI (or a
       | GitHub Action) to build and publish a new copy of the SQLite
       | index on every change.
       | 
       | I've started thinking of this pattern as a kind of static-dynamic
       | site: there's dynamic server-side code but it's running in read-
       | only containers, so you can scale it up by running more copies
       | and if anything goes wrong you just restart the container.
       | 
       | https://til.simonwillison.net/ is my most recent site to use this
       | pattern, see https://github.com/simonw/til for how it works.
       | 
       | I also wrote this tutorial describing the pattern a while ago:
       | https://24ways.org/2018/fast-autocomplete-search-for-your-we...
        
         | tootie wrote:
         | It's mentioned in this post but lunr.js is a clever option if
         | you don't have much content. The idea is that your search page
         | has to create a json object with all your content and lunr will
         | build an index out of it client-side. This sounds like terrible
         | architecture but you could stuff about 100 blog posts into an
         | object the size of one big jpeg. For a few dozen articles it's
         | pretty snappy.
        
           | techntoke wrote:
           | A few dozen articles? I've seen examples with Fuse.js and
           | Hugo searching over 10,000 articles and it is fast. No
           | server-side components required.
        
           | simonw wrote:
           | Yeah that's a pretty useful trick.
           | 
           | Sphinx, the Python documentation engine, does something like
           | that - e.g. https://datasette.readthedocs.io/en/stable/search
           | .html?q=fts... which runs off this generated JavaScript index
           | file:
           | https://datasette.readthedocs.io/en/stable/searchindex.js
        
       ___________________________________________________________________
       (page generated 2020-05-02 23:00 UTC)