Поисковый интерфейс Elasticsearch с React

У меня есть сайт React с боковым и основным контентом. Я хочу использовать search-ui для поиска на сайте.

Панель поиска должна быть сбоку, а когда пользователь что-то ищет, результаты должны отображаться на основном контенте. Побочное и основное содержимое представляют собой два отдельных реакционных компонента.

В свою очередь, я настраиваю Search-UI SearchBox следующим образом

      <SearchBox
    autocompleteResults={{
        titleField: "title",
        urlField: "url"
    }}
    autocompleteSuggestions={true}
    onSubmit={searchTerm => {
        navigate("/elastic-search?q=" + searchTerm);
    }}
    onSelectAutocomplete={(selection, {}, defaultOnSelectAutocomplete) => {
        if (selection.suggestion) {
            navigate("/elastic-search?q=" + selection.suggestion);
        } else {
            defaultOnSelectAutocomplete(selection);
        }
    }}
/>

Поэтому, когда пользователь что-то ищет, приложение будет перенаправлять на отдельную страницу с именем elastic-search, и я передаю searchTerm в URL-адресе через метод навигации.

В MainContent у меня есть такие результаты:

      <Results titleField='title' urlField='url'/>

Теперь вопрос в том, как я могу получить searchTerm и отобразить результаты в основном контенте. Структура приложения такая:

      <App>
   <SearchProvider config={config}>
      <Aside /> ---- Here I have <SearchBox>
      <MainContent /> ---- Here I have <Results>
   </SearchProvider>
</App>

Когда я ищу, приложение перенаправляется на /elastic-search с searchTerm в URL-адресе, но результаты не отображаются. Если я обновляю страницу, они отображаются. Как я могу уведомить Результаты или повторно отобразить страницу, чтобы я мог показать результаты поиска.

1 ответ

В ваших результатах отсутствуют некоторые параметры, и они должны выглядеть примерно так:

      <>
  <Results
    titleField="title"
    urlField=""
    view={SearchView}
    resultView={SearchResultView}
  />
</>

И ваши компоненты SearchView (используется для переопределения представления по умолчанию для этого компонента) и SearchResultView (используется для переопределения отдельных представлений результатов .) должны выглядеть примерно так:

      const SearchView = ({ children }) => {
   return <div>{children}</div>
};

const SearchResultView = ({ result: searchResult }) => {
  return <div>{searchResult.content}</div>
}

Дополнительное предложение

Это рабочий пример в приложении Next.js с import { useRouter } from "next/router";который необходимо заменить вашим решением маршрутизации. В компоненте SearchBox :

      export const SearchBoxComponent = () => {
 const router = useRouter();
 return (
  <>
  <SearchBox
    searchAsYouType={true}
    autocompleteResults={{
      titleField: "title",
      urlField: "",
      shouldTrackClickThrough: true,
      clickThroughTags: ["test"],
    }}
    autocompleteSuggestions={true}
    onSubmit={(searchTerm) => {
      const urlEncodedQuery = encodeURI(searchTerm).replace(/%20/g, "+");
      router.push(`/search?q=${urlEncodedQuery}`);
    }}
    ...
    </>
    )
    }
Другие вопросы по тегам