ไลบรารีการค้นหาแบบคลุมเครือสำหรับ PHP
นี่คือพอร์ต PHP ของโปรเจ็กต์ Fuse.js ที่ยอดเยี่ยมและมีเป้าหมายเพื่อให้ความเข้ากันได้ของ API เต็มรูปแบบในทุกที่ที่เป็นไปได้
ลองชมการสาธิตและตัวอย่างเพื่อทำความเข้าใจว่าห้องสมุดนี้มีความสามารถอะไรบ้าง
เวอร์ชัน Fuse.js ที่เข้ากันได้ล่าสุด: 7.0.0
สารบัญ:
แพ็คเกจนี้มีจำหน่ายผ่าน Composer หากต้องการเพิ่มลงในโครงการของคุณ เพียงเรียกใช้:
composer require loilo/fuse
โปรดทราบว่าจำเป็นต้องใช้ PHP อย่างน้อย 7.4 เพื่อใช้งาน Fuse
นี่เป็นตัวอย่างการใช้งานง่ายๆ:
<?php
require_once ' vendor/autoload.php ' ;
$ list = [
[
' title ' => " Old Man's War " ,
' author ' => ' John Scalzi ' ,
],
[
' title ' => ' The Lock Artist ' ,
' author ' => ' Steve Hamilton ' ,
],
[
' title ' => ' HTML5 ' ,
' author ' => ' Remy Sharp ' ,
],
[
' title ' => ' Right Ho Jeeves ' ,
' author ' => ' P.D Woodhouse ' ,
],
];
$ options = [
' keys ' => [ ' title ' , ' author ' ],
];
$ fuse = new Fuse Fuse ( $ list , $ options );
$ fuse -> search ( ' hamil ' );
สิ่งนี้นำไปสู่ผลลัพธ์ต่อไปนี้ (โดยที่แต่ละ item
ของผลลัพธ์อ้างถึงรายการที่ตรงกันและ refIndex
ระบุตำแหน่งของรายการในต้นฉบับ $list
):
[
[
' item ' => [
' title ' => ' The Lock Artist ' ,
' author ' => ' Steve Hamilton ' ,
],
' refIndex ' => 1 ,
],
[
' item ' => [
' title ' => ' HTML5 ' ,
' author ' => ' Remy Sharp ' ,
],
' refIndex ' => 2 ,
],
];
ฟิวส์มีตัวเลือกมากมายในการปรับแต่งการค้นหาของคุณ:
isCaseSensitive
bool
false
ระบุว่าการเปรียบเทียบควรคำนึงถึงขนาดตัวพิมพ์หรือไม่
includeScore
bool
false
ควรรวมคะแนนไว้ในชุดผลลัพธ์หรือไม่ คะแนน 0
แสดงถึงการจับคู่ที่สมบูรณ์แบบ ในขณะที่คะแนน 1
บ่งชี้ว่าการจับคู่ไม่ตรงกันโดยสมบูรณ์
includeMatches
bool
false
ควรรวมการแข่งขันไว้ในชุดผลลัพธ์หรือไม่ เมื่อ true
แต่ละระเบียนในชุดผลลัพธ์จะรวมดัชนีของอักขระที่ตรงกัน สิ่งเหล่านี้สามารถใช้เพื่อวัตถุประสงค์ในการเน้นได้
minMatchCharLength
int
1
เฉพาะการแข่งขันที่มีความยาวเกินค่านี้เท่านั้นที่จะถูกส่งคืน (เช่น หากคุณต้องการละเว้นการจับคู่อักขระตัวเดียวในผลลัพธ์ ให้ตั้งค่าเป็น 2
)
shouldSort
bool
true
ไม่ว่าจะเรียงลำดับรายการผลลัพธ์ตามคะแนน
findAllMatches
bool
false
เมื่อเป็นจริง ฟังก์ชันการจับคู่จะดำเนินต่อไปจนถึงจุดสิ้นสุดของรูปแบบการค้นหา แม้ว่าการจับคู่ที่สมบูรณ์แบบจะอยู่ในสตริงแล้วก็ตาม
keys
array
[]
รายการคีย์ที่จะค้นหา สิ่งนี้รองรับเส้นทางที่ซ้อนกัน การค้นหาแบบถ่วงน้ำหนัก การค้นหาในอาร์เรย์ของสตริงและอ็อบเจ็กต์
location
int
0
กำหนดโดยประมาณว่ารูปแบบที่คาดว่าจะพบอยู่ที่ตำแหน่งใดในข้อความ
threshold
float
0.6
อัลกอริธึมการจับคู่จะยอมแพ้เมื่อใด เกณฑ์ 0.0
ต้องมีการจับคู่ที่สมบูรณ์แบบ (ทั้งตัวอักษรและตำแหน่ง) เกณฑ์ 1.0
จะตรงกับอะไรก็ได้
distance
int
100
กำหนดว่าการแข่งขันจะต้องอยู่ใกล้ตำแหน่งที่ไม่ชัดเจนเพียงใด (ระบุตาม location
) การจับคู่ตัวอักษรทุกประการโดย distance
ห่างจากตำแหน่งที่ไม่ชัดเจนจะถือว่าไม่ตรงกันเลย distance
ทาง 0
กำหนดให้การแข่งขันอยู่ใน location
ที่แน่นอนที่ระบุ ระยะทาง 1000
จะต้องมีการจับคู่ที่สมบูรณ์แบบโดยมีความยาวไม่เกิน 800
อักขระของ location
ที่จะพบโดยใช้ threshold
0.8
ignoreLocation
bool
false
เมื่อ true
การค้นหาจะไม่สนใจ location
และ distance
ดังนั้นจึงไม่สำคัญว่ารูปแบบจะปรากฏที่ใดในสตริง
เคล็ดลับ: ตัวเลือกเริ่มต้นจะค้นหาเฉพาะอักขระ 60 ตัวแรกเท่านั้น ซึ่งควรจะเพียงพอหากมีการคาดหวังอย่างสมเหตุสมผลว่าการแข่งขันอยู่ภายในช่วงนี้ หากต้องการแก้ไขลักษณะการทำงานนี้ ให้ตั้งค่าชุดค่าผสมที่เหมาะสมของ
location
,threshold
,distance
(หรือignoreLocation
)เพื่อทำความเข้าใจว่าตัวเลือกเหล่านี้ทำงานร่วมกันอย่างไร โปรดอ่านเกี่ยวกับทฤษฎีการให้คะแนนของ Fuse.js
useExtendedSearch
bool
false
เมื่อ true
จะทำให้สามารถใช้คำสั่งค้นหาแบบยูนิกซ์ได้ ดูตัวอย่าง
getFn
callable
ฟังก์ชันที่จะใช้เพื่อดึงค่าของวัตถุที่เส้นทางที่ให้ไว้ ค่าเริ่มต้นจะค้นหาเส้นทางที่ซ้อนกันด้วย
sortFn
callable
ฟังก์ชั่นที่ใช้จัดเรียงผลลัพธ์ทั้งหมด ค่าเริ่มต้นจะเรียงลำดับตามคะแนนความเกี่ยวข้องจากน้อยไปหามาก ดัชนีจากน้อยไปมาก
ignoreFieldNorm
bool
false
เมื่อ true
การคำนวณคะแนนความเกี่ยวข้อง (ใช้ในการเรียงลำดับ) จะไม่สนใจบรรทัดฐานความยาวของฟิลด์
เคล็ดลับ: เวลาเดียวที่เหมาะสมที่จะตั้ง
ignoreFieldNorm
ให้เป็นtrue
คือเมื่อไม่สำคัญว่าจะมีกี่คำ แต่จะมีเพียงคำค้นหาที่มีอยู่เท่านั้น
fieldNormWeight
float
1
กำหนดว่าบรรทัดฐานความยาวฟิลด์ส่งผลต่อการให้คะแนนมากน้อยเพียงใด ค่า 0
เทียบเท่ากับการละเว้นบรรทัดฐานความยาวของฟิลด์ ค่า 0.5
จะลดผลกระทบของบรรทัดฐานความยาวฟิลด์ลงอย่างมาก ในขณะที่ค่า 2.0
จะเพิ่มขึ้นอย่างมาก
คุณสามารถเข้าถึงและจัดการค่าเริ่มต้นของตัวเลือกทั้งหมดข้างต้นได้ด้วยวิธี config
:
// Get an associative array of all options listed above
Fuse :: config ();
// Merge associative array of options into default config
Fuse :: config ([ ' shouldSort ' => false ]);
// Get single default option
Fuse :: config ( ' shouldSort ' );
// Set single default option
Fuse :: config ( ' shouldSort ' , false );
วิธีการต่อไปนี้มีให้ใช้งานในแต่ละอินสแตนซ์ FuseFuse
:
search
ค้นหาคอลเลกชั่นเอกสารทั้งหมด และส่งคืนรายการผลลัพธ์การค้นหา
public function search( mixed $ pattern , ? array $ options ): array
$pattern
สามารถเป็นหนึ่งใน:
$options
:
limit
(ประเภท: int
): หมายถึงจำนวนสูงสุดของผลลัพธ์การค้นหาที่ส่งคืนsetCollection
ตั้งค่า/แทนที่คอลเลกชันเอกสารทั้งหมด หากไม่มีการระบุดัชนี จะมีการสร้างดัชนีขึ้นมา
public function setCollection( array $ docs , ? Fuse Core FuseIndex $ index ): void
ตัวอย่าง:
$ fruits = [ ' apple ' , ' orange ' ];
$ fuse = new Fuse ( $ fruits );
$ fuse -> setCollection ([ ' banana ' , ' pear ' ]);
add
เพิ่มเอกสารในคอลเลกชันและอัปเดตดัชนีตามนั้น
public function add( mixed $ doc ): void
ตัวอย่าง:
$ fruits = [ ' apple ' , ' orange ' ];
$ fuse = new Fuse ( $ fruits );
$ fuse -> add ( ' banana ' );
sizeof ( $ fruits ); // => 3
remove
ลบเอกสารทั้งหมดออกจากรายการที่ภาคแสดงส่งคืนตามความเป็นจริง และส่งคืนอาร์เรย์ของเอกสารที่ถูกลบออก เพรดิเคตถูกเรียกใช้ด้วยสองอาร์กิวเมนต์: ($doc, $index)
public function remove(? callable $ predicate ): array
ตัวอย่าง:
$ fruits = [ ' apple ' , ' orange ' , ' banana ' , ' pear ' ];
$ fuse = new Fuse ( $ fruits );
$ results = $ fuse -> remove (fn( $ doc ) => $ doc === ' banana ' || $ doc === ' pear ' );
sizeof ( $ fuse -> getCollection ()); // => 2
$ results ; // => ['banana', 'pear']
removeAt
ลบเอกสารที่ดัชนีที่ระบุ
public function removeAt( int $ index ): void
ตัวอย่าง:
$ fruits = [ ' apple ' , ' orange ' , ' banana ' , ' pear ' ];
$ fuse = new Fuse ( $ fruits );
$ fuse -> removeAt ( 1 );
$ fuse -> getCollection (); // => ['apple', 'banana', 'pear']
getIndex
ส่งกลับดัชนีฟิวส์ที่สร้างขึ้น
public function getIndex(): Fuse Core FuseIndex
ตัวอย่าง:
$ fruits = [ ' apple ' , ' orange ' , ' banana ' , ' pear ' ];
$ fuse = new Fuse ( $ fruits );
$ fuse -> getIndex ()-> size (); // => 4
วิธีการต่อไปนี้มีให้ใช้งานในแต่ละอินสแตนซ์ FuseFuse
:
Fuse::createIndex
สร้างดัชนีไว้ล่วงหน้าจากรายการ และส่งผ่านไปยังอินสแตนซ์ Fuse โดยตรง หากรายการมีขนาดใหญ่ (มาก) จะทำให้การสร้างอินสแตนซ์เร็วขึ้น
public static function createIndex( array $ keys , array $ docs , array $ options = []): Fuse Core FuseIndex
ตัวอย่าง:
$ list = [ ... ]; // See the example from the 'Usage' section
$ options = [ ' keys ' => [ ' title ' , ' author.firstName ' ] ];
// Create the Fuse index
$ myIndex = Fuse :: createIndex ( $ options [ ' keys ' ], $ list );
// Initialize Fuse with the index
$ fuse = new Fuse ( $ list , $ options , $ myIndex );
Fuse::parseIndex
แยกวิเคราะห์ดัชนีฟิวส์อนุกรม JSON
public static function parseIndex( array $ data , array $ options = []): Fuse Core FuseIndex
ตัวอย่าง:
// (1) When the data is collected
$ list = [ ... ]; // See the example from the 'Usage' section
$ options = [ ' keys ' => [ ' title ' , ' author.firstName ' ] ];
// Create the Fuse index
$ myIndex = Fuse :: createIndex ( $ options [ ' keys ' ], $ list );
// Serialize and save it
file_put_contents ( ' fuse-index.json ' , json_encode ( $ myIndex ));
// (2) When the search is needed
// Load and deserialize index to an array
$ fuseIndex = json_decode ( file_get_contents ( ' fuse-index.json ' ), true );
$ myIndex = Fuse :: parseIndex ( $ fuseIndex );
// Initialize Fuse with the index
$ fuse = new Fuse ( $ list , $ options , $ myIndex );
ฟิวส์.เจส | ฟิวส์ PHP | |
---|---|---|
รับเวอร์ชันฟิวส์ | Fuse.version | - |
เข้าถึงการกำหนดค่าส่วนกลาง | คุณสมบัติ Fuse.config | วิธี Fuse::config |
การปรับเปลี่ยนรายการ | การใช้ fuse.add() ฯลฯ แก้ไขรายการดั้งเดิมที่ส่งผ่านไปยังตัวสร้าง new Fuse | ใน PHP อาร์เรย์เป็นประเภทข้อมูลดั้งเดิม ซึ่งหมายความว่ารายการดั้งเดิมของคุณจะไม่ถูกแก้ไขโดย Fuse หากต้องการรับรายการปัจจุบันหลังจากเพิ่ม/ลบรายการ คุณสามารถใช้เมธอด $fuse->getCollection() ได้ |
โปรดทราบว่าฉันมุ่งมั่นที่จะสร้างความเท่าเทียมกันของคุณลักษณะกับ Fuse.js และดังนั้นจึงจะไม่เพิ่มคุณลักษณะหรือการแก้ไขใด ๆ ให้กับตรรกะการค้นหาที่ไม่สะท้อนให้เห็นใน Fuse.js เอง
หากคุณมีปัญหาใดๆ กับผลการค้นหาที่ ไม่ใช่ จุดบกพร่องอย่างเห็นได้ชัดในพอร์ต PHP นี้ และคุณรู้จัก JavaScript โปรดตรวจสอบว่ากรณีการใช้งานของคุณทำงานอย่างถูกต้องในการสาธิตออนไลน์ของ Fuse.js หรือไม่ เนื่องจากนั่นคือการใช้งาน Canonical Fuse หากปัญหาปรากฏขึ้นที่นั่นด้วย โปรดเปิดปัญหาใน repo ของพวกเขา
ในการเริ่มการพัฒนาบน Fuse คุณต้องมี git, PHP (≥ 7.4) และ Composer
เนื่องจากโค้ดถูกจัดรูปแบบโดยใช้ Prettier จึงแนะนำให้ติดตั้ง Node.js/npm รวมถึงใช้โปรแกรมแก้ไขที่รองรับการจัดรูปแบบ Prettier
โคลนที่เก็บและ cd
ลงไป:
git clone https://github.com/loilo/fuse.git
cd fuse
ติดตั้งการพึ่งพาผู้แต่ง:
composer install
ติดตั้งการพึ่งพา npm (เป็นทางเลือก แต่แนะนำ) สิ่งนี้จำเป็นสำหรับการจัดรูปแบบโค้ดเท่านั้น เนื่องจากการพึ่งพา npm รวมถึงปลั๊กอิน Prettier ที่ใช้โดยโปรเจ็กต์นี้
npm ci
มีการตรวจสอบโค้ดหลายประเภทสำหรับโปรเจ็กต์นี้ สิ่งเหล่านี้ทั้งหมดจะทำงานเมื่อมีการส่งคำขอดึงข้อมูล แต่สามารถเรียกใช้ในเครื่องได้:
สั่งการ | วัตถุประสงค์ | คำอธิบาย |
---|---|---|
vendor/bin/phpcs | ตรวจสอบรูปแบบรหัส | เรียกใช้ PHP_CodeSniffer เพื่อตรวจสอบว่าซอร์สโค้ดของ Fuse เป็นไปตามรูปแบบการเข้ารหัส PSR-12 |
vendor/bin/psalm | การวิเคราะห์แบบคงที่ | เรียกใช้ Psalm กับ codebase เพื่อหลีกเลี่ยงข้อผิดพลาดเกี่ยวกับประเภทและรูปแบบการเข้ารหัสที่ไม่ปลอดภัย |
vendor/bin/phpunit | ตรวจสอบตรรกะของโปรแกรม | รันการทดสอบ PHPUnit ทั้งหมดจากโฟลเดอร์ test |
ก่อนที่จะส่งคำขอดึง โปรดเพิ่มการทดสอบที่เกี่ยวข้องลงในโฟลเดอร์ test