การใช้เครื่องมือค้นหาที่ใช้งานง่ายในเอนทิตีหลักคำสอน
สำหรับการใช้งานขั้นพื้นฐานสิ่งที่คุณต้องทำคือกำหนดแผนที่ของเอนทิตีที่ค้นหาและคุณสมบัติของพวกเขาเครื่องมือค้นหาจะจัดให้มีการโหลดอย่างถูกต้องและจะเรียงลำดับผลการค้นหาตามผู้สมัครที่พบโดยอัตโนมัติ
วัตถุประสงค์ของแพ็คเกจคือการจัดหา API อย่างง่ายสำหรับการค้นหาข้อความแบบเต็มขั้นสูงในเอนทิตีหลักคำสอน ในตอนต้นของการร้องขอรูปแบบการค้นหาจะถูกสร้างขึ้นและแพ็คเกจนี้จะช่วยให้มั่นใจได้ว่าผลลัพธ์ที่ดีที่สุดจะถูกค้นพบและส่งคืนตามความเกี่ยวข้อง
ในการติดตั้งนักแต่งเพลงการโทรแพ็คเกจด้วยตนเองและดำเนินการคำสั่งต่อไปนี้:
$ composer require baraja-core/doctrine-fulltext-search จากนั้นลงทะเบียน DoctrineFulltextSearchExtension ในการกำหนดค่านีออน:
extensions :
doctrineFulltextSearch : BarajaSearchDoctrineFulltextSearchExtension หรือคุณสามารถสร้างอินสแตนซ์ของ BarajaSearchSearch ด้วยตนเอง
การค้นหาดำเนินการโดยการสร้างแบบสอบถาม (เอนทิตีและคอลัมน์การทำแผนที่):
$ results = $ this -> search -> search ( $ query , [
Article ::class => [ ' :title ' ],
User ::class => ' :username ' , // it can also be an ordinary string for a single column
UserLogin ::class => [ ' :ip ' , ' hostname ' , ' userAgent ' ],
]);
echo $ results ; // Uses the default HTML renderer หรือคุณสามารถใช้ SelectorBuilder ด้วยการตรวจสอบประเภทที่เข้มงวดและวิธีการบอกใบ้เพื่อสร้างแบบสอบถาม:
$ results = $ this -> search -> selectorBuilder ( $ query )
-> addEntity ( Article ::class)
-> addColumnTitle ( ' title ' )
-> addEntity ( User ::class)
-> addColumnTitle ( ' username ' )
-> addEntity ( UserLogin ::class)
-> addColumnTitle ( ' ip ' )
-> addColumn ( ' hostname ' )
-> addColumnSearchOnly ( ' userAgent ' )
-> search ();
echo $ results ;ไม่จำเป็นต้องหลบหนีออกมาตรรกะทั้งหมดจะถูกแก้ไขโดยเครื่องยนต์โดยอัตโนมัติ
:username - คอลัมน์จะใช้เป็นคำบรรยายภาพ
!slug - คอลัมน์จะใช้สำหรับการค้นหา แต่ถูกละเว้นในเอาต์พุต Perex
_durationTime - คอลัมน์จะถูกโหลดลงในเอนทิตี แต่จะไม่ถูกนำมาพิจารณาเมื่อคำนวณความเกี่ยวข้องและจะไม่รวมอยู่ใน Perex
content.versions.haystack - ความสัมพันธ์ระหว่างเอนทิตีจะสร้างการเข้าร่วมและโหลดคุณสมบัติสุดท้ายโดยอัตโนมัติ
versions(content) - Custom Getter (เข้าร่วมคอลัมน์ versions โดยอัตโนมัติ แต่เรียก getContent() เพื่อรับข้อมูล)
หากเราใช้ลำไส้ใหญ่ที่จุดเริ่มต้นของชื่อคอลัมน์ (ตัวอย่างเช่น ':username' ) มันจะถูกใช้เป็นชื่อโดยอัตโนมัติ
ชื่อจะแสดงแม้ว่าจะไม่มีคำค้นหาก็ตาม
คำบรรยายอาจว่างเปล่าและอาจไม่มีอยู่ (อาจเป็น null )
หากไม่มีชื่อเรื่องเครื่องยนต์สามารถคำนวณได้โดยอัตโนมัติตามเหตุการณ์ที่ดีที่สุดในข้อความที่พบ
ข้อความค้นหาจะถูกทำให้เป็นมาตรฐานโดยอัตโนมัติและ คำสั่งหยุด จะถูกลบออกซึ่งไม่สมเหตุสมผลในการค้นหา
อัลกอริทึมสามารถแทนที่ในโครงการเฉพาะโดยใช้อินเทอร์เฟซ IQueryNormalizer และเขียนทับในคอนเทนเนอร์ DIC
ผลลัพธ์ของวิธี search() เป็นเอนทิตีของประเภท SearchResult ซึ่งใช้อินเตอร์เฟส Iterator สำหรับความสามารถในการหมุนเวียนผ่านผลลัพธ์ได้อย่างง่ายดาย
เคล็ดลับ: หากคุณเพียงแค่ต้องการพิมพ์ผลการค้นหาอย่างรวดเร็วและข้อกำหนดลักษณะที่ปรากฏไม่สูงมากเอนทิตี
SearchResultจะใช้วิธี__toString()โดยตรงเพื่อการเรนเดอร์ง่ายๆของผลลัพธ์โดยตรงเป็น HTML
ผลการค้นหาสรุปผลลัพธ์ทั้งหมดของการค้นหาทั้งหมดในทุกหน่วยงาน ผลลัพธ์ทั้งหมดได้มาจากวิธีการ getItems() - ผลลัพธ์จะเป็นอาร์เรย์ของเอนทิตีของประเภท SearchItem[]
อย่างไรก็ตามเรามักจะต้องรวบรวมแบบสอบถามเป็นกลุ่มและจากนั้นแสดงรายการเช่นหมวดหมู่และผลิตภัณฑ์แยกกัน ในการทำเช่นนี้ให้ใช้วิธีการของผู้ช่วย getItemsOfType(string $type) ซึ่งส่งคืนอาร์เรย์ที่ถูกตัดทอนผลลัพธ์ของประเภท SearchItem[] เฉพาะสำหรับเอนทิตีตามพารามิเตอร์ที่ผ่าน
เราใช้วิธี getItems() หรือ getItemsOfType() เพื่อรับผลการค้นหาที่เราผ่าน แต่จะทำงานกับผลลัพธ์ที่เฉพาะเจาะจงได้อย่างไร?
เป็นสิ่งสำคัญที่จะต้องทราบว่า ณ จุดนี้เราไม่มีวิธี __toString() อีกต่อไปและต้องแสดงผล (ในที่สุดในเทมเพลต) ตัวเราเอง
สำหรับกรณีส่วนใหญ่ผู้ช่วยเหลือสำเร็จรูปจะพอเพียง:
getTitle() ส่งคืนชื่อของเอนทิตีที่พบเป็นสตริงหรือ nullgetTitleHighlighted() เรียก getTitle() ภายในและหากผลลัพธ์เป็นสตริงที่ถูกต้องมันจะคราบเหตุการณ์แต่ละคำด้วย <i class="highlight"> และ </i>getSnippet() ส่งคืนตัวอย่างของเอนทิตีที่พบซึ่งสรุปพื้นที่ที่พบที่ดีที่สุดในเอนทิตีดั้งเดิม (ตัวอย่างเช่นบทความตัวอย่างที่คำค้นหาเกิดขึ้น) สามารถส่งคืนตัวอย่างเพิ่มเติมได้ (เหตุการณ์แต่ละครั้งจะถูกหารด้วยลำไส้ใหญ่) ส่งคืนสตริงเสมอ (สามารถว่างเปล่า)getTitleHighlighted() การโทรภายใน getSnippet() และสีการเกิดขึ้นของแต่ละคำด้วย <i class="highlight"> และ </i>getScore() ส่งคืนญาติ (แตกต่างกันตามบริบทตามข้อความค้นหาและข้อมูลที่มีอยู่ในแต่ละโครงการ) การประเมินจุดของผลลัพธ์ (ตามพารามิเตอร์นี้ผลลัพธ์จะถูกเรียงลำดับโดยอัตโนมัติ)getEntity() ส่งคืนเอนทิตีที่พบเดิมที่หลักคำสอนที่ผลิตภายใน การค้นหาดำเนินการโดยใช้การเลือกบางส่วนดังนั้นคุณสมบัติทั้งหมดอาจไม่สามารถใช้ได้ทั้งหมดentityToArray() ส่งคืนตัวเองเป็นอาร์เรย์ สตริงจะถูกทำให้เป็นมาตรฐานโดยอัตโนมัติ ทั้งสองวิธีในการรับผลลัพธ์ ( getItems() และ getItemsOfType() ) ยอมรับพารามิเตอร์ $limit (ค่าเริ่มต้น 10 ) และ $offset (ค่าเริ่มต้น 0 )
Paging เองนั้นใช้งานได้ดีที่สุดโดยใช้ Nette Pagination
จำนวนผลลัพธ์ทั้งหมดได้รับจากวิธีการ getCountResults() เหนือเอนทิตี SearchResult
เครื่องมือค้นหาใช้ PARTIAL เพื่อโหลดเอนทิตีฐานข้อมูลและห่อเอนทิตีผลลัพธ์ลงในผลการค้นหาเพื่อให้คุณสามารถโหลดได้ตลอดเวลาโดยการโทร ->getEntity() เหนือผลการค้นหาเฉพาะ
หากไม่พบผลลัพธ์หรือจำนวนของพวกเขาคือ "เล็ก" (คำจำกัดความถูกกำหนดโดยอัลกอริทึมเองตามการวิเคราะห์โครงการเฉพาะ) เคล็ดลับสำหรับการแก้ไขที่ดีที่สุดของคำค้นหาอาจ (และอาจไม่)
สำหรับความช่วยเหลือให้โทรหาวิธี getDidYouMean() ผ่าน SearchResult เอาต์พุตเป็นสตริง (คำค้นหาที่ดีกว่า) หรือ NULL
การแก้ไขคำค้นหาการค้นหาที่ดีที่สุดนั้นได้มาจากเครื่องมือค้นหาโดยใช้การวิเคราะห์การค้นหาขั้นสูงภายในแต่ละโครงการแยกกันโดยใช้วิธี การเรียนรู้ของเครื่อง ในการค้นหาแต่ละครั้งสถิติเกี่ยวกับการค้นหาจำนวนผลลัพธ์และสัญญาณอื่น ๆ จะถูกบันทึกและวิเคราะห์ย้อนหลังโดยอัตโนมัติหากจำเป็น
การได้รับความช่วยเหลือเป็นธรรมชาติและไม่สามารถได้รับอิทธิพลอย่างง่ายดาย เครื่องมือค้นหามุ่งมั่นเพื่อความเป็นกลางสูงสุดและเสนอคำของผู้ใช้ที่ค้นหาผู้อื่นและส่งคืนผลลัพธ์ที่เกี่ยวข้องให้ได้มากที่สุดตามบริบทปัจจุบัน มีการใช้ฟังก์ชั่นทางคณิตศาสตร์ที่ซับซ้อนภายในซึ่งเรากำลังปรับปรุงอย่างต่อเนื่องตามประสบการณ์จากโครงการทั้งหมด
เมื่อค้นหารายชื่อผู้สมัครสำหรับผลการค้นหาจะถูกรวบรวมเป็นครั้งแรก ผลลัพธ์เหล่านี้จะถูกส่งผ่านอัลกอริทึมการประเมินที่ดำเนินการประเมิน "สัมพัทธ์" อัตโนมัติในช่วง 0 int 512 (ขึ้นอยู่กับสัญญาณต่าง ๆ เช่นข้อความค้นหาประวัติผู้ใช้ล่าสุดภาษาสถานที่ทางกายภาพเนื้อหาเอนทิตีและประเภท)
ตามการประเมินจุดผลลัพธ์จะถูกจัดเรียงโดยอัตโนมัติ
อัลกอริทึมการให้คะแนนสามารถถูกแทนที่ได้โดยการใช้อินเตอร์เฟส IScoreCalculator และเขียนทับในคอนเทนเนอร์ DIC
baraja-core/doctrine-fulltext-search ได้รับอนุญาตภายใต้ใบอนุญาต MIT ดูไฟล์ใบอนุญาตสำหรับรายละเอียดเพิ่มเติม