Loading

Configure and Run Search UI

Stack Serverless

Next lets configure Search UI for our needs! Navigate to the config within app.js and update the following:

const config = { searchQuery: { search_fields: { title: { weight: 3 }, plot: {}, genre: {}, actors: {}, directors: {} }, result_fields: { title: { snippet: {} }, plot: { snippet: {} } }, disjunctiveFacets: ["genre.keyword", "actors.keyword", "directors.keyword"], facets: { "genre.keyword": { type: "value" }, "actors.keyword": { type: "value" }, "directors.keyword": { type: "value" }, released: { type: "range", ranges: [ { from: "2012-04-07T14:40:04.821Z", name: "Within the last 10 years" }, { from: "1962-04-07T14:40:04.821Z", to: "2012-04-07T14:40:04.821Z", name: "10 - 50 years ago" }, { to: "1962-04-07T14:40:04.821Z", name: "More than 50 years ago" } ] }, imdbRating: { type: "range", ranges: [ { from: 1, to: 3, name: "Pants" }, { from: 3, to: 6, name: "Mediocre" }, { from: 6, to: 8, name: "Pretty Good" }, { from: 8, to: 10, name: "Excellent" } ] } } }, autocompleteQuery: { results: { resultsPerPage: 5, search_fields: { "title.suggest": { weight: 3 } }, result_fields: { title: { snippet: { size: 100, fallback: true } }, url: { raw: {} } } }, suggestions: { types: { results: { fields: ["movie_completion"] } }, size: 4 } }, apiConnector: connector, alwaysSearchOnInitialLoad: true }; 

In the above example, we configured the:

  • query fields to search on title, plot, genre, actors and directors using the text fields
  • result fields to display title, plot, genre, actors and directors using the text fields
  • facets to display genre, actors and directors using the keyword fields
  • we made the facets disjunctive for better user experience. The user can select more than one facet to expand their search.
  • autocomplete results to suggest results with the same query fields as main search + returning some fields for display.

For more information on configuration, visit the API configuration docs.

We are going to do several steps here:

  • update the <Searchbox /> component to configure autocomplete
  • remove sorting options
  • add a <Facet /> component for each facet field
  • update the <Results /> component to display all the fields
<div className="App"> <ErrorBoundary> <Layout header={ <SearchBox autocompleteMinimumCharacters={3} autocompleteResults={{ linkTarget: "_blank", sectionTitle: "Results", titleField: "title", urlField: "url", shouldTrackClickThrough: true }} autocompleteSuggestions={true} debounceLength={0} /> } sideContent={ <div> {wasSearched && <Sorting label={"Sort by"} sortOptions={[]} />} <Facet key={"1"} field={"genre.keyword"} label={"genre"} /> <Facet key={"2"} field={"actors.keyword"} label={"actors"} /> <Facet key={"3"} field={"directors.keyword"} label={"directors"} /> <Facet key={"4"} field={"released"} label={"released"} /> <Facet key={"5"} field={"imdbRating"} label={"imdb rating"} /> </div> } bodyContent={<Results shouldTrackClickThrough={true} />} bodyHeader={ <React.Fragment> {wasSearched && <PagingInfo />} {wasSearched && <ResultsPerPage />} </React.Fragment> } bodyFooter={<Paging />} /> </ErrorBoundary> </div> 

Lets run the project with the command:

yarn start 

and then view the results in the browser at http://localhost:3000/

search-ui

Lets recap of the steps we have covered:

  • we setup and configured the Elasticsearch index for our data
  • we indexed an example movie
  • we checked out the starter app and added the Elasticsearch connector
  • we configured the Elasticsearch connector to connect to our Elasticsearch index
  • we updated the Search UI configuration to specify the fields to be searchable, facetable
  • we updated the components to use these fields

Next you can add more data into the index, update the results view to display more fields, and deploy the app.