การติดตั้ง | ภาพรวม | โทเค็นไลซ์ | การกั้นขวาง | หยุดคำ | ดัชนีการค้นหา | กลยุทธ์ดัชนี
Js Search ช่วยให้สามารถค้นหาอ็อบเจ็กต์ JavaScript และ JSON ฝั่งไคลเอ็นต์ได้อย่างมีประสิทธิภาพ รองรับ ES5 และไม่ต้องใช้ jQuery หรือไลบรารีบุคคลที่สามอื่นๆ
Js Search เริ่มต้นจากการนำ Lunr JS ไปใช้เพียงเล็กน้อย โดยนำเสนอการปรับปรุงประสิทธิภาพรันไทม์และขนาดไฟล์ที่เล็กลง นับตั้งแต่นั้นมาก็ได้ขยายออกไปเพื่อรวมชุดฟีเจอร์ที่หลากหลายซึ่งรองรับการกั้นคำหยุด คำหยุด และการจัดอันดับ TF-IDF
นี่คือเกณฑ์มาตรฐาน JS Perf บางส่วนที่เปรียบเทียบไลบรารีการค้นหาทั้งสอง (ขอบคุณ Olivernn ที่ปรับแต่งด้าน Lunr เพื่อการเปรียบเทียบที่ดีขึ้น!)
หากคุณกำลังมองหายูทิลิตีการค้นหา JS ที่ปรับให้เหมาะสมกับผู้ปฏิบัติงานบนเว็บที่ง่ายกว่า ลองดูที่ js-worker-search
คุณสามารถติดตั้งโดยใช้ Bower หรือ NPM ดังนี้:
npm install js-search
bower install js-search
ในระดับสูง คุณสามารถกำหนดค่า Js Search ได้โดยบอกว่าควรสร้างดัชนีฟิลด์ใดสำหรับการค้นหา จากนั้นเพิ่มอ็อบเจ็กต์ที่จะค้นหา
ตัวอย่างเช่น การใช้งาน JS Search อย่างง่ายจะเป็นดังนี้:
import * as JsSearch from 'js-search' ;
var theGreatGatsby = {
isbn : '9781597226769' ,
title : 'The Great Gatsby' ,
author : {
name : 'F. Scott Fitzgerald'
} ,
tags : [ 'book' , 'inspirational' ]
} ;
var theDaVinciCode = {
isbn : '0307474275' ,
title : 'The DaVinci Code' ,
author : {
name : 'Dan Brown'
} ,
tags : [ 'book' , 'mystery' ]
} ;
var angelsAndDemons = {
isbn : '074349346X' ,
title : 'Angels & Demons' ,
author : {
name : 'Dan Brown' ,
} ,
tags : [ 'book' , 'mystery' ]
} ;
var search = new JsSearch . Search ( 'isbn' ) ;
search . addIndex ( 'title' ) ;
search . addIndex ( [ 'author' , 'name' ] ) ;
search . addIndex ( 'tags' )
search . addDocuments ( [ theGreatGatsby , theDaVinciCode , angelsAndDemons ] ) ;
search . search ( 'The' ) ; // [theGreatGatsby, theDaVinciCode]
search . search ( 'scott' ) ; // [theGreatGatsby]
search . search ( 'dan' ) ; // [angelsAndDemons, theDaVinciCode]
search . search ( 'mystery' ) // [angelsAndDemons, theDaVinciCode]
Tokenization คือกระบวนการแบ่งข้อความ (เช่น ประโยค) ออกเป็นโทเค็นขนาดเล็กที่สามารถค้นหาได้ (เช่น คำหรือส่วนของคำ) Js Search มี tokenizer พื้นฐานที่ควรทำงานได้ดีสำหรับภาษาอังกฤษ แต่คุณสามารถจัดเตรียม tokenizer ของคุณเองได้:
search . tokenizer = {
tokenize ( text /* string */ ) {
// Convert text to an Array of strings and return the Array
}
} ;
การกั้นคำเป็นกระบวนการลดโทเค็นการค้นหาลงจนถึงราก (หรือ "ต้นกำเนิด") เพื่อให้การค้นหาคำในรูปแบบต่างๆ ยังคงให้ผลลัพธ์อยู่ ตัวอย่างเช่น "ค้นหา" "ค้นหา" และ "ค้นหา" ทั้งหมดสามารถลดลงเป็น "ค้นหา" ได้
Js Search ไม่ได้ใช้ไลบรารี่กั้นของตัวเอง แต่รองรับการกั้นผ่านการใช้ไลบรารีของบุคคลที่สาม
หากต้องการเปิดใช้งานการกั้น ให้ใช้ StemmingTokenizer
ดังนี้:
var stemmer = require ( 'porter-stemmer' ) . stemmer ;
search . tokenizer =
new JsSearch . StemmingTokenizer (
stemmer , // Function should accept a string param and return a string
new JsSearch . SimpleTokenizer ( ) ) ;
คำหยุดเป็นเรื่องธรรมดามาก (เช่น a, an, และ, the, of) และมักไม่มีความหมายทางความหมาย ตามค่าเริ่มต้น Js Search จะไม่กรองคำเหล่านี้ แต่สามารถเปิดใช้งานการกรองได้โดยใช้ StopWordsTokenizer
ดังนี้:
search . tokenizer =
new JsSearch . StopWordsTokenizer (
new JsSearch . SimpleTokenizer ( ) ) ;
ตามค่าเริ่มต้น Js Search จะใช้เวอร์ชันแก้ไขเล็กน้อยของคำหยุดประวัติ Google ที่แสดงอยู่ใน www.ranks.nl/stopwords คุณสามารถแก้ไขรายการคำหยุดนี้ได้โดยการเพิ่มหรือลบค่าออกจากออบเจ็กต์ JsSearch.StopWordsMap
ดังนี้:
JsSearch . StopWordsMap . the = false ; // Do not treat "the" as a stop word
JsSearch . StopWordsMap . bob = true ; // Treat "bob" as a stop word
โปรดทราบว่าคำหยุดเป็นตัวพิมพ์เล็ก ดังนั้นการใช้เจลทำความสะอาดแบบคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่อาจป้องกันไม่ให้คำหยุดบางคำถูกลบออก
มีดัชนีการค้นหาสองรายการที่มาพร้อมกับ js-search
ความถี่ของภาคเรียน–ความถี่ของเอกสารผกผัน (หรือ TF-IDF) เป็นสถิติเชิงตัวเลขที่มีจุดมุ่งหมายเพื่อสะท้อนถึงความสำคัญของคำ (หรือคำต่างๆ) ต่อเอกสารภายในคลังข้อมูล ค่า TF-IDF จะเพิ่มขึ้นตามสัดส่วนกับจำนวนครั้งที่คำปรากฏในเอกสาร แต่จะถูกชดเชยด้วยความถี่ของคำในคลังข้อมูล ซึ่งจะช่วยปรับความจริงที่ว่าคำบางคำ (เช่น และ หรือ the) ปรากฏบ่อยกว่าคำอื่นๆ
ตามค่าเริ่มต้น Js Search รองรับการจัดอันดับ TF-IDF แต่สามารถปิดใช้งานได้ด้วยเหตุผลด้านประสิทธิภาพหากไม่จำเป็น คุณสามารถระบุการใช้งาน ISearchIndex
ทางเลือกเพื่อปิดการใช้งาน TF-IDF ได้ดังนี้:
// default
search . searchIndex = new JsSearch . TfIdfSearchIndex ( ) ;
// Search index capable of returning results matching a set of tokens
// but without any meaningful rank or order.
search . searchIndex = new JsSearch . UnorderedSearchIndex ( ) ;
มีสามกลยุทธ์ดัชนีที่มาพร้อมกับ js-search
ดัชนี PrefixIndexStrategy
สำหรับการค้นหาคำนำหน้า (เช่น คำว่า "cat" ได้รับการจัดทำดัชนีเป็น "c", "ca" และ "cat" ทำให้สามารถค้นหาคำนำหน้าได้)
ดัชนี AllSubstringsIndexStrategy
สำหรับสตริงย่อยทั้งหมด กล่าวอีกนัยหนึ่ง "c", "ca", "cat", "a", "at" และ "t" ทั้งหมดตรงกับ "cat"
ExactWordIndexStrategy
จัดทำดัชนีสำหรับการจับคู่คำที่ตรงกันทุกประการ ตัวอย่างเช่น "bob" จะจับคู่กับ "bob jones" (แต่ "bo" จะไม่จับคู่)
ตามค่าเริ่มต้น Js Search รองรับการจัดทำดัชนีคำนำหน้า แต่สามารถกำหนดค่าได้ คุณสามารถระบุการใช้งาน IIndexStrategy
ทางเลือกเพื่อปิดใช้งานการสร้างดัชนีคำนำหน้า เช่น:
// default
search . indexStrategy = new JsSearch . PrefixIndexStrategy ( ) ;
// this index strategy is built for all substrings matches.
search . indexStrategy = new JsSearch . AllSubstringsIndexStrategy ( ) ;
// this index strategy is built for exact word matches.
search . indexStrategy = new JsSearch . ExactWordIndexStrategy ( ) ;