React 응용 프로그램에서 Meilisearch를 구현하는 방법
소개
이 빠른 강좌에서 Meili Search의 강력한 기능을 빌려 즉각적이고 신뢰할 수 있는 결과를 가진 검색 페이지를 만드는 방법을 배울 것입니다.
MeiliSearch is an open source, high-relevancy search engine, built in Rust.
검색을 실행하는 기본 절차를 소개하고 마지막으로 더 높은 주제를 토론할 것입니다.
예를 들어 우리는 스포츠 브랜드를 위해 신속하고 아름다운 검색 체험을 다시 만들 것이다.
다음과 같이 구성할 내용입니다.
선결 조건
시작하기 전에 기계에 설치되어 있는지 확인하십시오Node.
사용자가 만든 사용자 정의 항목을 사용하여 React 응용 프로그램에 템플릿 코드를 작성합니다: https://github.com/Giorat/meili_react_demo
마지막으로, 이 강좌는 당신이 이미 익숙하다고 가정합니다React.그렇지 않으면 React 문서를 보고 자세한 내용을 확인할 수 있습니다.
입문
클론 저장소
git clone https://github.com/Giorat/meili_react_demo.git
cd meili_react_demo
새 Docker 이미지 실행
저장소가 복제된 경우 MeiliSearch 인스턴스를 설정하려면 기본 폴더에서 다음을 수행하십시오.
npm run setup_meili
클론 repo가 없고 Docker 인스턴스를 직접 생성하려면 다음 명령을 수행합니다.docker run -p 7700:7700 -v $(pwd)/data.ms:/data.ms getmeili/meilisearch
다음 URL에 액세스하여 MeiliSearch가 실행 중인지 확인할 수 있습니다.MeiliSearch에서 색인 만들기
색인은 특정한 설정과 유일한 키를 가진 대상 그룹과 같은 문서를 저장하는 실체이다.
MeiliSearch 문서에서 indexes 속성에 대한 자세한 내용을 확인할 수 있습니다.
색인을 만들기 위해서는 메인 키가 무엇인지 찾아야 합니다.다음은 MeiliSearch에 추가할 예제 문서입니다.
{
"id": 100013768717,
"name": "Fitness Foldable Shoe Bag",
"url": "https://www.decathlon.com/products/gym-foldable-shoe-bag",
"vendor": "Domyos",
"category": "Sport bag",
"tags": [
"Artistic Gymnastics",
"Boy's",
"CARDIO_FITNESS_ACCESSORIES",
"CARDIO_FITNESS_BAGS",
"CODE_R3: 11782"
],
"images": "https://cdn.shopify.com/s/files/1/1330/6287/products/sac_20a_20chaussure_20kaki_20_7C_20001_20_7C_20PSHOT_20_490180e6-44e4-4340-8e3d-c29eb70c6ac8.jpg?v=1584683232",
"creation_date": "2020-04-03T15:58:48-07:00",
"price": "2.49"
}
이 문서에서 문서의 고유 값을 저장하는 필드는 id
필드입니다.이 속성은 MeiliSearch에서 primary key
라고 합니다.Postman과 같은 Rest 클라이언트를 사용하여 쉽게 색인을 만들 수 있지만, 이 강좌에서는 Meilisearch Javascript SDK를 사용하여 노드에서 직접 색인을 만들 것입니다.js.
const MeiliSearch = require("meilisearch");
(async () => {
try {
const config = {
host: 'http://127.0.0.1:7700'
};
const meili = new MeiliSearch(config);
await meili.createIndex({ uid: "decathlon", primaryKey: "id" });
} catch (e) {
console.log("Meili error: ", e.message);
}
})();
색인 문서
MeiliSearch는 JSON 형식의 문서를 받아서 검색할 수 있도록 저장합니다.이러한 문서는 모든 유형의 데이터를 저장할 수 있는 필드로 구성됩니다.
이 강좌에서 이 운동복 항목이 가득한 데이터 집합을 다운로드할 수 있습니다.
const MeiliSearch = require("meilisearch");
(async () => {
try {
const config = {
host: 'http://127.0.0.1:7700'
};
const meili = new MeiliSearch(config);
const decathlon = require("./decathlon.json"); // path to json file
const index = await meili.getIndex("decathlon");
await index.addDocuments(decathlon);
} catch (e) {
console.log("Meili error: ", e.message);
}
})();
이 스크립트를 실행하기 전에 JSON 파일의 경로를 변경하는 것을 기억하십시오!React 애플리케이션 준비
표준 React 응용 프로그램을 사용하거나 CRA를 사용하여 응용 프로그램을 만들거나 이 저장소를 복제하기만 하면 됩니다.
git clone https://github.com/Giorat/meili_react_demo.git
cd meili_react_demo
빈 프로그램부터 시작하는 것을 좋아한다면, 다음 명령을 사용하여 프로그램을 만들 수 있습니다.원하는 대로 응용 프로그램의 이름을 지정할 수 있습니다.npx create-react-app meili_react_demo
cd meili_react_demo
순풍 CSS 포함
스타일링 프로세스를 가속화하기 위해 색인에 Tailwind CSS 스타일을 직접 추가할 수 있습니다.html:
<link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet">
애플리케이션을 구성합니다.js 상태
그런 다음 응용 프로그램을 수정합니다.js 파일은 이 코드를 사용하여 간단한 검색 폼과 몇 개의 상태 변수를 설정하여 검색의 각 방면을 처리합니다.
import React, { useState, useEffect } from "react";
// TODO configure the MeiliSearch Client
function App() {
const [searchedWord, setSearch] = useState("dumbell");
const [resultSearch, setResults] = useState([]);
const [resultCards, setCards] = useState([]);
// TODO add function to send searchedWord to MeiliSearch
// TODO add function to parse the JSON object
return (
<div className="mx-auto">
<div class="header font-sans text-white items-center justify-center">
<header class="py-12">
<img
class="h-20 w-auto items-center justify-center p-2 mx-auto"
src="/wide_logo.png"
style={{ filter: "invert(0%)" }}
alt=""
/>
<h1 class="flex flex-wrap flex-grow text-3xl w-full justify-center p-4">
Stop looking for an item — find it and work hard!
</h1>
<div class="border rounded overflow-hidden w-full flex justify-center mx-auto searchBox mt-6">
<button class="flex items-center justify-center px-4 shadow-md bg-white text-black">
<svg
class="h-4 w-4 text-grey-dark"
fill="currentColor"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
>
<path d="M16.32 14.9l5.39 5.4a1 1 0 0 1-1.42 1.4l-5.38-5.38a8 8 0 1 1 1.41-1.41zM10 16a6 6 0 1 0 0-12 6 6 0 0 0 0 12z" />
</svg>
</button>
<input
type="text"
value={searchedWord}
onChange={(event) => setSearch(event.target.value)}
class="px-6 py-4 w-full text-black"
placeholder="Product, sport, color, …"
/>
</div>
</header>
</div>
<div>
<div class="flex flex-wrap searchResults">{resultCards}</div>
</div>
</div>
);
}
export default App;
이 코드는 이 예쁜 제목과 검색 폼을 출력해야 한다.React의 검색 결과
Meili Search Javascript SDK를 사용하여 React에서 Meili Search에 연결하는 것은 간단한 작업으로 몇 단계만 거치면 완성할 수 있다.
MeiliSearch 클라이언트
MeiliSearch SDK 설치:
# if you use npm
npm install meilisearch
# if you use yarn
yarn add meilisearch
서버 URL을 사용하여 MeiliSearch 클라이언트를 설정합니다.우리의 예에서, 그것은 로컬 호스트 Docker 기계입니다.마지막으로 백엔드에서 정확한 인덱스를 불러옵니다.응용 프로그램에서 이 설명을 대체합니다.js의 코드 세그먼트는 다음과 같습니다.
// TODO configure the MeiliSearch Client
import MeiliSearch from "meilisearch";
const client = new MeiliSearch({
host: "http://127.0.0.1:7700/",
});
const index = client.getIndex("decathlon");
검색 질의 보내기
useEffect
를 사용하여 입력한 단어를 MeiliSearch에 검색합니다.모든 결과를 클릭하면 "results Search"라는 간단한 상태 변수로 설정됩니다.응용 프로그램에서 이 설명을 대체합니다.js의 코드 세그먼트는 다음과 같습니다.
// TODO add function to send searchedWord to MeiliSearch
useEffect(() => {
// Create an scoped async function in the hook
async function searchWithMeili() {
const search = await index.search(searchedWord);
setResults(search.hits);
}
// Execute the created function directly
searchWithMeili();
}, [searchedWord]);
결과 표시
1초 이내
useEffect
에 MeiliSearch가 반환하는 JSON 객체를 검색합니다.이러한 구조는 업로드된 JSON 객체와 동일합니다.그리고 제품 페이지에 연결된 카드 목록을 만들 때가 되었다.
응용 프로그램에서 이 설명을 대체합니다.js의 코드 세그먼트는 다음과 같습니다.
// TODO add function to parse the JSON object
useEffect(() => {
let arrayItems = [];
for (let i = 0; i < resultSearch.length; i++) {
const product = resultSearch[i];
arrayItems.push(
<div class="flex w-full sm:w-1/2 md:w-1/3 lg:w-1/4 xl:w-1/6 p-3">
<a
href={product.url}
class="flex-1 rounded overflow-hidden shadow-lg"
>
<img
class="w-full h-48 object-cover"
src={product.images}
alt={product.name}
onError={(e)=>{e.target.onerror = null; e.target.src="/wide_logo.png"}}
/>
<div class="px-6 py-3">
<div class="font-bold text-sm mb-1 text-gray-600 capitalize">
{product.category}
</div>
<div class="font-bold text-xl mb-2 text-gray-800">
{product.vendor} - {product.name.substr(0, 20)}
</div>
<p class="text-black text-xl font-bold text-base py-2">
$ {product.price}
</p>
</div>
</a>
</div>
);
}
setCards(arrayItems);
}, [resultSearch]);
여기에서 전체 App.js 코드를 볼 수 있습니다.검색 추가 구성!
MeiliSearch를 사용하면 검색 환경을 개선하기 위해 다양한 추가 옵션을 사용할 수 있습니다.고급 탐색에 대해 추가 설정 절차를 수행해야 합니다.
검색 순위
검색 순위 변경부터 시작하거나 더 간단하게 말하자면, Meilisearch는 사용자가 올린 문서를 보고 rankingRules 대상에서 검색어의 인용을 찾을 수 있습니다.이 경우 다음 순위를 설정합니다.
검색 가능 속성
그 다음으로 searchableAttributes 객체의 각 문서에서 검색할 수 있는 MeiliSearch 속성을 지정해야 합니다.여기서 구성은 이미지나 URL을 검색하지 않고 이름, 공급업체, 범주 및 태그만 검색하도록 합니다.
표시 속성
마지막으로 MeiliSearch가 프런트엔드 응용 프로그램에서 사용할 수 있는 displayedAttributes 객체를 사용자에게 반환할 속성을 지정해야 합니다.
새 설정을 MeiliSearch에 업로드
const MeiliSearch = require("meilisearch");
(async () => {
try {
const config = {
host: 'http://127.0.0.1:7700'
};
const meili = new MeiliSearch(config);
const index = await meili.getIndex("decathlon");
const newSettings = {
rankingRules: [
"typo",
"words",
"proximity",
"attribute",
"wordsPosition",
"exactness",
"desc(creation_date)"
],
searchableAttributes: ["name", "vendor", "category", "tags"],
displayedAttributes: [
"name",
"vendor",
"category",
"tags",
"images",
"url"
]
};
await index.updateSettings(newSettings);
} catch (e) {
console.log("Meili error: ", e.message);
}
})();
결론
만약 믿을 수 없는 단체가 밤낮으로 이 위대한 프로젝트를 위해 일하지 않는다면, 이런 빠른 검색은 불가능하다.MeiliSearch 가문에 기여하는 것을 좋아한다면 이 저장소를 클릭하면 도움말, 질문, 팁을 얻을 수 있습니다.
Reference
이 문제에 관하여(React 응용 프로그램에서 Meilisearch를 구현하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/meilisearch/how-to-implement-meilisearch-in-your-react-app-1m5e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)