A demonstration that exposes Lucene search as an HTTP API.
A common use case for Lucene is supporting search on websites. A user types in a search phrase on a web page, the browser
makes an HTTP request to a server, and the server engages Lucene and a Lucene index. The lucene-playground/http-api
project implements a runnable Java program that embeds Lucene embedded into a web server.
Follow these instructions to build and run a Lucene demo program:
- Use Java 21
- Build and run the program:
-
./gradlew run
- It should look something like the following.
-
$ ./gradlew run ... omitted ... 11:19:47 [main] INFO dgroomes.TimeZoneSearchSystem - Indexing 605 known time zones. 11:19:47 [main] INFO dgroomes.TimeZoneSearchSystem - Indexing done. 11:19:47 [main] INFO dgroomes.Runner - The Lucene search server is serving traffic on port 8080
-
- Make some search requests
-
curl -X GET http://localhost:8080?keyword=Europe
- Try some of your own searches. Use Lucene syntax.
- Altogether, it might look something like this:
Search found 65 hits for keyword 'Europe'. Facet results: dim=observes_daylight_savings_time path=[] value=65 childCount=2 true (54) false (11) dim=time_zone_display_name path=[] value=65 childCount=12 Central European Standard Time (31) Eastern European Standard Time (16) ...omitted... dim=offset path=[] value=65 childCount=5 PT1H (32) PT2H (16) ...omitted... Hits: Middle Europe Time (MET) offset=PT1H observesDST=true Greenwich Mean Time (Europe/Belfast) offset=PT0S observesDST=true Greenwich Mean Time (Europe/Dublin) offset=PT0S observesDST=true Greenwich Mean Time (Europe/Guernsey) offset=PT0S observesDST=true Greenwich Mean Time (Europe/Isle_of_Man) offset=PT0S observesDST=true Greenwich Mean Time (Europe/Jersey) offset=PT0S observesDST=true Western European Standard Time (Europe/Lisbon) offset=PT0S observesDST=true Greenwich Mean Time (Europe/London) offset=PT0S observesDST=true Central European Standard Time (Europe/Amsterdam) offset=PT1H observesDST=true ...omitted... $ curl -X GET http://localhost:8080?keyword=Isla No search results found for keyword 'Isla' $ curl -X GET http://localhost:8080?keyword=Isla* Search found 16 hits for keyword 'Isla*'. Facet results: dim=observes_daylight_savings_time path=[] value=16 childCount=2 false (13) true (3) dim=time_zone_display_name path=[] value=16 childCount=12 Marshall Islands Time (3) Easter Island Standard Time (2) ...omitted... dim=offset path=[] value=16 childCount=9 PT12H (5) PT11H (3) ...omitted... Hits: Cook Islands Standard Time (Pacific/Rarotonga) offset=PT-10H observesDST=false Easter Island Standard Time (Chile/EasterIsland) offset=PT-6H observesDST=true Easter Island Standard Time (Pacific/Easter) offset=PT-6H observesDST=true
-
- Stop the server
- Stop the server process with
Ctrl + C
.
- Stop the server process with
General clean-ups, TODOs and things I wish to implement for this project:
- IN PROGRESS Facet search. Define facets on maybe "observes daylight savings time" and one other dimension?
- DONE (that was harder than I thought, and I've made this subproject more complex than I planned but I did learn some good stuff) Index (and "facet" index?) "observes daylight savings time".
- DONE "Search result-side" facet implementation. Facets present at the search-side but also at the search result-side (even without specifying them in the search). I have to implement the search result-side first
- "Search-side" facet implementation. Maybe a query param?
- Related document changes / finishing touches.