Reputation: 1036
I am new to the field of front end programming and need some advice. I am trying to build a website for a search application. For this purpose, I am using the Elastic Search UI (find documentation here: https://github.com/elastic/search-ui). The Elastic Search UI provides the layouts and some technical usage, that is helpful for search requests.
I have been starting by understanding the given example page about national parks. The code looks as follows:
import React from "react";
import moment from "moment";
import AppSearchAPIConnector from "@elastic/search-ui-app-search-connector";
import {
ErrorBoundary,
Facet,
SearchProvider,
SearchBox,
Results,
PagingInfo,
ResultsPerPage,
Paging,
Sorting,
WithSearch
} from "@elastic/react-search-ui";
import {
BooleanFacet,
Layout,
SingleSelectFacet,
SingleLinksFacet
} from "@elastic/react-search-ui-views";
import "@elastic/react-search-ui-views/lib/styles/styles.css";
const SORT_OPTIONS = [
{
name: "Relevance",
value: "",
direction: ""
},
{
name: "Title",
value: "title",
direction: "asc"
}
];
const connector = new AppSearchAPIConnector({
searchKey: "search-371auk61r2bwqtdzocdgutmg",
engineName: "search-ui-examples",
hostIdentifier: "host-2376rb",
endpointBase: ""
});
const config = {
alwaysSearchOnInitialLoad: true,
searchQuery: {
result_fields: {
title: {
snippet: {
size: 100,
fallback: true
}
},
nps_link: {
raw: {}
},
description: {
snippet: {
size: 100, // size of the description field, i.e. the text displayed
fallback: true
}
}
},
disjunctiveFacets: ["acres", "states", "date_established", "location"],
facets: {
world_heritage_site: { type: "value" },
states: { type: "value", size: 30 },
acres: {
type: "range",
ranges: [
{ from: -1, name: "Any" },
{ from: 0, to: 1000, name: "Small" },
{ from: 1001, to: 100000, name: "Medium" },
{ from: 100001, name: "Large" }
]
},
location: {
// San Francisco. In the future, make this the user's current position
center: "37.7749, -122.4194",
type: "range",
unit: "mi",
ranges: [
{ from: 0, to: 100, name: "Nearby" },
{ from: 100, to: 500, name: "A longer drive" },
{ from: 500, name: "Perhaps fly?" }
]
},
date_established: {
type: "range",
ranges: [
{
from: moment()
.subtract(50, "years")
.toISOString(),
name: "Within the last 50 years"
},
{
from: moment()
.subtract(100, "years")
.toISOString(),
to: moment()
.subtract(50, "years")
.toISOString(),
name: "50 - 100 years ago"
},
{
to: moment()
.subtract(100, "years")
.toISOString(),
name: "More than 100 years ago"
}
]
},
visitors: {
type: "range",
ranges: [
{ from: 0, to: 10000, name: "0 - 10000" },
{ from: 10001, to: 100000, name: "10001 - 100000" },
{ from: 100001, to: 500000, name: "100001 - 500000" },
{ from: 500001, to: 1000000, name: "500001 - 1000000" },
{ from: 1000001, to: 5000000, name: "1000001 - 5000000" },
{ from: 5000001, to: 10000000, name: "5000001 - 10000000" },
{ from: 10000001, name: "10000001+" }
]
}
}
},
apiConnector: connector
};
export default function App() {
return (
<SearchProvider config={config}>
<WithSearch mapContextToProps={({ wasSearched }) => ({ wasSearched })}>
{({ wasSearched }) => {
return (
<div className="App">
<ErrorBoundary>
<Layout
header={
<SearchBox
/>
}
sideContent={
<div>
{wasSearched && (
<Sorting label={"Sort by"} sortOptions={SORT_OPTIONS} />
)}
<Facet
field="states"
label="States"
filterType="any"
isFilterable={true}
/>
<Facet
field="world_heritage_site"
label="World Heritage Site?"
view={BooleanFacet}
/>
<Facet
field="visitors"
label="Visitors"
view={SingleLinksFacet}
/>
<Facet
field="date_established"
label="Date Established"
filterType="any"
/>
<Facet
field="location"
label="Distance"
filterType="any"
/>
<Facet
field="acres"
label="Acres"
view={SingleSelectFacet}
/>
</div>
}
bodyContent={
<Results
titleField="title"
urlField="nps_link"
shouldTrackClickThrough={true}
/>
}
bodyHeader={
<React.Fragment>
{wasSearched && <PagingInfo />}
{wasSearched && <ResultsPerPage />}
</React.Fragment>
}
bodyFooter={<Paging />}
/>
</ErrorBoundary>
</div>
);
}}
</WithSearch>
</SearchProvider>
);
}
The example page can be seen here:
https://search-ui-stable.netlify.app/
I understand most of the code and how to modify the search components for my needs. Now I want to "upload" my own data. From what I am understanding, I have to do this over an API. I have already written one, that takes some input query (i.e. the search request) and outputs a json file. My question is now: How can I "extract" the search query and pass it to my API and as a result show the results, which should be the output of my API?
I think, I have to add some code here:
<WithSearch mapContextToProps={({ wasSearched }) => ({ wasSearched })}>
{({ wasSearched }) => {
But I am not quite sure what to do. Thank you for your help! :)
Upvotes: 0
Views: 2372
Reputation: 2500
In case it helps for somebody you have to make the difference between ElasticSearch and AppSearch (Elasticsearch product)
search-ui works by default with AppSearch. If you want to connect Elasticsearch directly you have to build a custom connector.
You can use this example though: https://github.com/elastic/search-ui/tree/master/examples/elasticsearch
Live Demo https://search-ui-stable-elasticsearch.netlify.com/
Regards
Upvotes: 0