日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
使用Fuse.js將動(dòng)態(tài)搜索添加到React應(yīng)用

Fuse.js是一個(gè)輕量級(jí)的搜索引擎,可以在用戶的瀏覽器中的客戶端運(yùn)行。讓我們看看如何使用它來輕松地為React應(yīng)用添加搜索功能。

何時(shí)使用Fuse.js

搜索功能對(duì)很多類型的網(wǎng)站都很有用,可以讓用戶高效地找到他們想要的東西。但為什么我們會(huì)專門選擇使用Fuse.js呢?

為搜索提供動(dòng)力的選擇有很多,最簡單的可能是使用現(xiàn)有的數(shù)據(jù)庫。例如,Postgres有一個(gè)全文搜索功能。MySQL也有,Redis也有RediSearch模塊。

還有一些專門的搜索引擎,其中Elasticsearch和Solr是最受歡迎的。這些搜索引擎需要更多的設(shè)置,但它們擁有你的用例可能需要的高級(jí)功能。

最后,你可以使用Algolia或Swiftype等搜索即服務(wù)平臺(tái)。這些服務(wù)運(yùn)行自己的搜索基礎(chǔ)架構(gòu)。你只需通過API提供數(shù)據(jù)、配置和查詢。

但是,您可能不需要這些解決方案所暴露的能力,這可能需要大量的工作來實(shí)現(xiàn),更不用說成本了。如果沒有太多的數(shù)據(jù)需要搜索,F(xiàn)use.js需要最小的設(shè)置,并且可以提供比您自己可能想到的更好的搜索體驗(yàn)。

至于多少數(shù)據(jù)對(duì)Fuse.js來說是過多的,考慮到Fuse.js需要訪問整個(gè)數(shù)據(jù)集,所以你需要在客戶端全部加載。如果數(shù)據(jù)集的大小是100MB,那就超出了發(fā)送給客戶端的合理范圍。但如果它只有幾千字節(jié),它可能是Fuse.js的一個(gè)很好的候選者。

構(gòu)建一個(gè)Fuse.js + React演示應(yīng)用程序

讓我們做一個(gè)基本的React應(yīng)用,使用Fuse.js讓用戶搜索狗的品種。你可以在這里查看最終的結(jié)果,源代碼可以在GitHub上找到。

我們將從設(shè)置一些腳手架開始。從一個(gè)新的Node.js項(xiàng)目開始,我們將安裝React和Fuse.js:

 
 
 
 
  1. npm install --save react react-dom fuse.js
  2. //or
  3. yarn add react react-dom fuse.js

我們還將安裝Parcel作為開發(fā)依賴項(xiàng):

 
 
 
 
  1. npm install --save-dev parcel@2.0.0-beta.1
  2. //or
  3. yarn add --dev parcel@2.0.0-beta.1

我們將在 package.json 啟動(dòng)腳本中使用它來編譯應(yīng)用程序:

 
 
 
 
  1. {  
  2.   "scripts": {
  3.     "start": "parcel serve ./index.html --open"
  4.   }
  5. }

接下來,我們將創(chuàng)建一個(gè)barebones index.html,其中包含一個(gè)空的 div 供React渲染,以及一個(gè) noscript 消息,以避免在用戶禁用JavaScript時(shí)出現(xiàn)空白頁面。

 
 
 
 
  1.   
  2.     
  •     
  •     
  •   
  • 我們將使我們的 index.js 簡單的開始。我們將渲染一個(gè)有搜索查詢輸入的表單,盡管我們還不會(huì)實(shí)際處理搜索。

     
     
     
     
    1. import React, { useState } from "react";
    2. import ReactDom from "react-dom";
    3. function Search() {
    4.   return (
    5.     
    6.       Search for a dog breed:
    7.       
    8.       
    9.     
    10.   );
    11. }
    12. ReactDom.render(, document.getElementById("app"));

    此時(shí),如果你運(yùn)行 npm run start 或 yarn run start,Parcel應(yīng)該會(huì)在瀏覽器中打開網(wǎng)站,你應(yīng)該會(huì)看到這個(gè)表單。

    實(shí)施搜索

    現(xiàn)在開始實(shí)施搜索,我們將從顯示搜索結(jié)果的組件開始。我們需要處理三種情況:

    • 用戶尚未執(zhí)行搜索時(shí)
    • 沒有查詢結(jié)果時(shí)(因?yàn)槲覀儾幌M脩粽J(rèn)為某些問題)
    • 什么時(shí)候有結(jié)果顯示

    我們將在ordered list中顯示所有結(jié)果。

     
     
     
     
    1. function SearchResults(props) {
    2.   if (!props.results) {
    3.     return null;
    4.   }
    5.   if (!props.results.length) {
    6.     return 

      There are no results for your query.

      ;
    7.   }
    8.   return (
    9.     
      1.       {props.results.map((result) => (
      2.         {result}
      3.       ))}
      4.     
    10.   );
    11. }

    我們也來編寫自己的搜索函數(shù)。稍后,我們將能夠?qū)⑽覀兊暮唵畏椒ǖ慕Y(jié)果與Fuse.js的結(jié)果進(jìn)行比較。

    我們的方法很簡單:我們將遍歷犬種數(shù)組(來自這個(gè)JSON列表),并返回包含整個(gè)搜索查詢的所有犬種。我們還會(huì)讓所有東西都小寫,這樣搜索就不區(qū)分大小寫了。

     
     
     
     
    1. const dogs = [
    2.   "Affenpinscher",
    3.   "Afghan Hound",
    4.   "Aidi",
    5.   "Airedale Terrier",
    6.   "Akbash Dog",
    7.   "Akita",
    8.   // More breeds..
    9. ];
    10. function searchWithBasicApproach(query) {
    11.   if (!query) {
    12.     return [];
    13.   }
    14.   return dogs.filter((dog) => dog.toLowerCase().includes(query.toLowerCase()));
    15. }

    接下來,讓我們將所有內(nèi)容鏈接在一起,方法是從表單提交中獲取搜索查詢,然后執(zhí)行搜索并顯示結(jié)果。

     
     
     
     
    1. function Search() {
    2.   const [searchResults, setSearchResults] = useState(null);
    3.   return (
    4.     <>
    5.       
    6.         onSubmit={(event) => {
    7.           event.preventDefault();
    8.           const query = event.target.elements.query.value;
    9.           const results = searchWithBasicApproach(query);
    10.           setSearchResults(results);
    11.         }}
    12.       >
    13.         Search for a dog breed:
    14.         
    15.         
    16.       
    17.       
    18.     
    19.   );
    20. }

    添加Fuse.js

    使用Fuse.js很簡單,我們需要導(dǎo)入它,讓它使用 new Fuse() 對(duì)數(shù)據(jù)進(jìn)行索引,然后使用索引的搜索功能。搜索會(huì)返回一些元數(shù)據(jù),所以我們將只提取實(shí)際的項(xiàng)目進(jìn)行展示。

     
     
     
     
    1. import Fuse from "fuse.js";
    2. const fuse = new Fuse(dogs);
    3. function searchWithFuse(query) {
    4.   if (!query) {
    5.     return [];
    6.   }
    7.   return fuse.search(query).map((result) => result.item);
    8. }

    元數(shù)據(jù)包括一個(gè) refIndex 整數(shù),讓我們可以回溯到原始數(shù)據(jù)集中的相應(yīng)項(xiàng)目。如果我們用 new Fuse(dogs, {includeScore: true}) 初始化索引,我們也會(huì)得到匹配分?jǐn)?shù):一個(gè)介于0和1之間的值,其中0是完全匹配。那么“Husky”的搜索結(jié)果就會(huì)像這樣:

     
     
     
     
    1. [
    2.   {
    3.     item: "Siberian Husky",
    4.     refIndex: 386,
    5.     score: 0.18224241177399383
    6.   }
    7. ]

    我們將在 Search 組件的表單中添加一個(gè)復(fù)選框,讓用戶選擇是否使用Fuse.js而不是基本的搜索函數(shù)。

     
     
     
     
    1.   onSubmit={(event) => {
    2.     event.preventDefault();
    3.     const query = event.target.elements.query.value;
    4.     const useFuse = event.target.elements.fuse.checked;
    5.     setSearchResults(
    6.       useFuse ? searchWithFuse(query) : searchWithBasicApproach(query)
    7.     );
    8.   }}
    9. >
    10.   Search for a dog breed: 
    11.   
    12.   
    13.    Use Fuse.js
    14.   

    現(xiàn)在我們可以用Fuse.js進(jìn)行搜索了!我們可以使用復(fù)選框來比較使用它和不使用它。

    最大的區(qū)別在于Fuse.js可以容忍錯(cuò)別字(通過近似字符串匹配),而我們的基本搜索則需要精確匹配。如果我們把“retriever”拼錯(cuò)為“retreiver”,請(qǐng)查看基本搜索結(jié)果。

    以下是針對(duì)同一查詢更有用的Fuse.js結(jié)果:

    搜索多個(gè)字段

    如果我們關(guān)心多個(gè)字段,我們的搜索可能會(huì)更復(fù)雜。例如,想象一下,我們想通過品種和原產(chǎn)國來搜索。Fuse.js支持這種用例。當(dāng)我們創(chuàng)建索引時(shí),我們可以指定要索引的對(duì)象鍵。

     
     
     
     
    1. const dogs = [
    2.   {breed: "Affenpinscher", origin: "Germany"},
    3.   {breed: "Afghan Hound", origin: "Afghanistan"},
    4.   // More breeds..
    5. ];
    6. const fuse = new Fuse(dogs, {keys: ["breed", "origin"]});

    現(xiàn)在,F(xiàn)use.js將同時(shí)搜索 breed 和 origin 字段。

    總結(jié)

    有時(shí)候,我們不想花費(fèi)資源去建立一個(gè)完整的Elasticsearch實(shí)例。當(dāng)我們有簡單的需求時(shí),F(xiàn)use.js可以提供相應(yīng)的簡單解決方案。而正如我們所看到的,將它與React一起使用也是很簡單的。

    即使我們需要更高級(jí)的功能,F(xiàn)use.js也允許給不同的字段賦予不同的權(quán)重,添加 AND 和 OR 邏輯,調(diào)整模糊匹配邏輯等等。當(dāng)你下次需要在應(yīng)用中添加搜索功能時(shí),可以考慮使用它。


    分享文章:使用Fuse.js將動(dòng)態(tài)搜索添加到React應(yīng)用
    文章出自:http://www.5511xx.com/article/cophgcs.html