เปรียบเทียบเครื่องมือค้นหาข้อความแบบเต็ม - Lucene, Sphinx, Postgresql, MySQL?


312

ฉันกำลังสร้างเว็บไซต์ Django และฉันกำลังมองหาเครื่องมือค้นหา

ผู้สมัครไม่กี่:

  • Lucene / Lucene พร้อมเข็มทิศ / Solr

  • บุคคลลึกลับ

  • Postgresql ในตัวการค้นหาข้อความแบบเต็ม

  • การค้นหาข้อความแบบเต็มในตัว MySQl

เกณฑ์การคัดเลือก:

  • ความเกี่ยวข้องของผลลัพธ์และการจัดอันดับ
  • การค้นหาและการจัดทำดัชนีความเร็ว
  • ใช้งานง่ายและใช้งานง่ายด้วย Django
  • ข้อกำหนดด้านทรัพยากร - ไซต์จะโฮสต์บนVPSดังนั้นเครื่องมือค้นหาจึงไม่จำเป็นต้องใช้ RAM และ CPU จำนวนมาก
  • ความยืดหยุ่น
  • คุณสมบัติพิเศษเช่น "คุณหมายถึงอะไร" การค้นหาที่เกี่ยวข้อง ฯลฯ

ทุกคนที่เคยมีประสบการณ์กับเครื่องมือค้นหาด้านบนหรือเครื่องมืออื่น ๆ ที่ไม่ได้อยู่ในรายชื่อ - ฉันชอบที่จะได้ยินความคิดเห็นของคุณ

แก้ไข: สำหรับความต้องการการจัดทำดัชนีในขณะที่ผู้ใช้ป้อนข้อมูลลงในเว็บไซต์ข้อมูลเหล่านั้นจะต้องได้รับการจัดทำดัชนีอย่างต่อเนื่อง ไม่จำเป็นต้องเป็นแบบเรียลไทม์ แต่ข้อมูลใหม่ ๆ จะปรากฏในดัชนีโดยมีความล่าช้าไม่เกิน 15 - 30 นาที


26
2 ¢: การค้นหาแบบเต็ม MySQL และการทำธุรกรรมเป็น (ปัจจุบัน) พิเศษร่วมกัน ดัชนี MySQL แบบเต็มต้องการประเภทตาราง MyISAM ซึ่งไม่รองรับธุรกรรม (ตรงข้ามกับชนิดตาราง InnoDB ซึ่งรองรับการทำธุรกรรม แต่ไม่ใช่ดัชนี fulltext)
Carl G

2
การค้นหาข้อความแบบเต็มของ PostgreSQL Tsearch ไม่รองรับการค้นหาวลี แต่ก็อยู่ในรายชื่อสิ่งที่ต้องทำsai.msu.su/~megera/wiki/FTS_Todo
Gnanam

1
ใครก็ตามที่กำลังมองหาสิ่งนี้สำหรับ Django ควรเช็คเอาท์แอปพลิเคชันฟาง haystacksearch.org
Keyo


24
@CarlG สำหรับการอ้างอิงของทุกคน MySQL 5.6+ มีการสนับสนุนการค้นหาข้อความแบบเต็มด้วยเครื่องมือ innodb
DhruvPathak

คำตอบ:


167

ดีใจที่ได้เห็นใครบางคนถูกหลอกเกี่ยวกับ Lucene - เพราะฉันไม่รู้ว่ามัน

ในทางกลับกันฉันรู้ค่อนข้างดีดังนั้นเรามาดูกันว่าฉันสามารถช่วยได้บ้างไหม

  • การจัดอันดับความเกี่ยวข้องของผลลัพธ์เป็นค่าเริ่มต้น คุณสามารถตั้งค่าการเรียงลำดับของคุณเองได้ตามที่คุณต้องการ
  • ความเร็วในการจัดทำดัชนีนั้นเร็วมากเพราะมันพูดถึงฐานข้อมูลโดยตรง ความเชื่องช้าใด ๆ จะมาจากการสืบค้น SQL ที่ซับซ้อนและคีย์ต่างประเทศที่ไม่ได้จัดทำดัชนีและปัญหาอื่น ๆ ฉันไม่เคยสังเกตเห็นความเชื่องช้าใด ๆ ในการค้นหาเช่นกัน
  • ฉันเป็น Rails guy ดังนั้นฉันไม่รู้เลยว่ามันง่ายที่จะใช้กับ Django มี Python API ที่มาพร้อมกับแหล่ง Sphinx
  • search service daemon (searchd) ค่อนข้างต่ำในการใช้หน่วยความจำ - และคุณสามารถกำหนดขีด จำกัดจำนวนหน่วยความจำที่กระบวนการทำดัชนีใช้
  • ความสามารถในการปรับขนาดนั้นเป็นที่ที่ความรู้ของฉันเป็นแบบร่างมากขึ้น - แต่มันง่ายพอที่จะคัดลอกไฟล์ดัชนีไปยังหลายเครื่องและรันหลาย daemon การค้นหา ความประทับใจทั่วไปที่ฉันได้รับจากคนอื่น ๆ ก็คือมันค่อนข้างดีภายใต้ภาระสูงดังนั้นการปรับขนาดมันออกไปในหลาย ๆ เครื่องไม่ใช่สิ่งที่ต้องจัดการ
  • ไม่มีการสนับสนุน 'แบบที่คุณหมายถึง' ฯลฯ - แม้ว่าสิ่งเหล่านี้สามารถทำได้ด้วยเครื่องมืออื่น ๆ ได้ง่ายพอ สฟิงซ์ไม่ใช้คำศัพท์แม้ว่าจะใช้พจนานุกรมดังนั้น 'การขับรถ' และ 'ไดรฟ์' (เช่น) จะถือว่าเหมือนกันในการค้นหา
  • สฟิงซ์ไม่อนุญาตการอัพเดทดัชนีบางส่วนสำหรับข้อมูลภาคสนาม วิธีการทั่วไปในการนี้คือการรักษาดัชนีเดลต้าที่มีการเปลี่ยนแปลงล่าสุดทั้งหมดและจัดทำดัชนีใหม่หลังจากการเปลี่ยนแปลงทุกครั้ง (และผลลัพธ์ใหม่เหล่านั้นจะปรากฏขึ้นภายในหนึ่งหรือสองวินาที) เนื่องจากข้อมูลมีจำนวนน้อยจึงอาจใช้เวลาไม่กี่วินาที คุณยังคงต้องจัดทำดัชนีชุดข้อมูลหลักใหม่เป็นประจำแม้ว่า (แม้ว่าจะขึ้นอยู่กับความผันผวนของข้อมูลของคุณเป็นประจำทุกวันหรือไม่? ทุกชั่วโมง?) ความเร็วการจัดทำดัชนีที่รวดเร็วทำให้สิ่งนี้ไม่เจ็บปวด

ฉันไม่รู้เลยว่าสถานการณ์ของคุณเป็นอย่างไร แต่Evan Weaver ได้เปรียบเทียบตัวเลือกการค้นหา Rails ทั่วไป (Sphinx, Ferret (พอร์ตของ Lucene for Ruby) และ Solr) โดยใช้มาตรฐานบางอย่าง อาจมีประโยชน์ฉันเดา

ฉันไม่ได้ลดทอนความลึกของการค้นหาข้อความแบบเต็มของ MySQL แต่ฉันรู้ว่ามันไม่ได้แข่งขันอย่างรวดเร็วและไม่ฉลาดกับ Sphinx, Lucene หรือ Solr


สฟิงซ์ช่วยให้คุณสามารถอัปเดตแอตทริบิวต์แต่ละรายการในดัชนีปัจจุบัน แต่ไม่สามารถลบ / อัปเดตระเบียนทั้งหมด
Xorlev

sphinx RT ช่วยให้คุณทำการปรับปรุง / ลบบางส่วนได้ มันยังอยู่ในช่วงเริ่มต้น แต่ก็เกือบจะได้ผลแล้ว sphinxsearch.com/wiki/doku.php?id=rt_tutorial
pQd

4
นี่คือคำตอบสำหรับ Solrที่เป็นคู่ที่ดีสำหรับคำตอบนี้ในสฟิงซ์
New Alexandria

ไม่มีอะไรสามารถจับคู่สฟิงซ์เพื่อความเร็วได้ดังนั้นถ้าความเร็วเป็นสิ่งที่คุณกังวลอันดับหนึ่งสฟิงซ์คือตัวเลือกที่จะทำ Nice post
twigg

สฟิงซ์ 2.3.2 Beta มีฟีเจอร์ที่เรียกว่า 'CALL SUGGEST' ซึ่งสามารถนำไปใช้ในการใช้งานได้ 'คุณหมายถึงอะไร?' sphinxsearch.com/docs/devel.html#sphinxql-call-suggest
Vinod K

82

ฉันไม่รู้จักสฟิงซ์ แต่สำหรับ Lucene เทียบกับการค้นหาข้อความแบบเต็มฐานข้อมูลฉันคิดว่าประสิทธิภาพของ Lucene นั้นไม่ตรงกัน คุณควรสามารถทำการค้นหาเกือบทุกครั้งในเวลาน้อยกว่า 10 มิลลิวินาทีไม่ว่าคุณจะต้องค้นหาข้อมูลมากน้อยเพียงใดโดยที่คุณได้ตั้งค่าดัชนี Lucene ของคุณอย่างถูกต้อง

มาที่นี่ที่กีดขวางที่ใหญ่ที่สุดแม้ว่า: ส่วนตัวผมคิดว่าการบูรณาการ Lucene ในโครงการของคุณไม่ได้เป็นเรื่องง่าย แน่นอนว่ามันไม่ยากเกินไปที่จะตั้งค่าเพื่อให้คุณสามารถทำการค้นหาขั้นพื้นฐานได้ แต่ถ้าคุณต้องการได้รับประโยชน์สูงสุดด้วยประสิทธิภาพสูงสุดคุณต้องมีหนังสือดี ๆ เกี่ยวกับ Lucene

สำหรับความต้องการของ CPU & RAM การค้นหาใน Lucene ไม่ได้ใช้งาน CPU มากเกินไปแม้ว่าการจัดทำดัชนีข้อมูลของคุณคือแม้ว่าคุณจะไม่ทำเช่นนั้นบ่อยเกินไป (อาจจะวันละครั้งหรือสองครั้งต่อวัน) ก็ตาม อุปสรรค์มาก

มันไม่ได้ตอบคำถามของคุณทั้งหมด แต่อย่างย่อถ้าคุณมีข้อมูลจำนวนมากที่ต้องการค้นหาและคุณต้องการประสิทธิภาพที่ยอดเยี่ยมฉันคิดว่า Lucene เป็นวิธีที่ดีที่สุด หากคุณไม่มีข้อมูลที่จะค้นหาจำนวนมากคุณก็อาจไปค้นหาฐานข้อมูลแบบข้อความ การตั้งค่าการค้นหาข้อความแบบเต็ม MySQL นั้นง่ายกว่าแน่นอนในหนังสือของฉัน


10
เปรียบเทียบกับสฟิงซ์ความคมชัดสูงและช้า ฉันใช้ทั้งในโครงการของฉันและในที่สุดฉันก็ติดสฟิงซ์ Lucence อยู่ใน java และใช้ CPU และ RAM มากกว่า Sphinx
Phyo Arkar Lwin

25
ฉันไม่เห็นด้วยที่นี่ Lucene เร็วมากถ้าคุณสร้างดัชนีที่ถูกต้อง โดยทั่วไปคุณสามารถทำแบบสอบถามขั้นสูงมากกว่าล้านระเบียนในเวลาเพียงไม่กี่มิลลิวินาที คุณเพียงแค่ต้องรู้ว่าคุณกำลังทำอะไรอยู่ และ Lucene อยู่ในจาวา ... ประเด็นของคุณคืออะไร? นอกจากนี้ยังมีพอร์ต. NET, Lucene.NET btw
Razzie

15
แต่คุณระบุไว้อย่างชัดเจนว่าคุณไม่ได้ใช้สฟิงซ์และ v3sson ใช้ทั้งสองอย่าง
user508546

20
คุณจะระบุได้อย่างไรว่าประสิทธิภาพของลูซินนั้นไม่มีใครเทียบได้ในประโยคเดียวกับที่คุณระบุว่าคุณไม่ได้ใช้สฟิงซ์
user508546

22
คำถามที่ถูกต้อง ฉันไม่เคยบอกว่า Lucene เร็วกว่าสฟิงซ์ฉันบอกว่า Lucene กับการค้นหาข้อความแบบเต็มฐานข้อมูลนั้นไม่ตรงกัน และมันก็เป็น. ไม่มีคำถามเกี่ยวกับเรื่องนั้น Lucene ขึ้นอยู่กับดัชนีฤvertedษี ตอนนี้ฉันไม่รู้จักสฟิงซ์ดังที่ได้กล่าวไว้ก่อนหน้านี้ แต่ถ้ามันใช้ดัชนีกลับด้านหรือวิธีการจัดทำดัชนีที่คล้ายกัน ระบุว่า Lucene เมื่อเทียบกับสฟิงซ์จะเป็น 'tooo ช้าและเทอะทะ' ไม่ได้ขึ้นอยู่กับข้อเท็จจริง โดยเฉพาะอย่างยิ่งไม่ใช่เมื่อมีการกล่าวเพียงว่า Lucene อยู่ใน 'Java' ซึ่งเป็นเพียงปัญหาที่ไร้สาระในแง่ของประสิทธิภาพ
Razzie

60

ฉันประหลาดใจที่ไม่มีข้อมูลเพิ่มเติมเกี่ยวกับ Solr Solr ค่อนข้างคล้ายกับสฟิงซ์ แต่มีคุณสมบัติขั้นสูง (AFAIK เนื่องจากฉันไม่ได้ใช้สฟิงซ์ - อ่านเฉพาะเกี่ยวกับเรื่องนี้)

คำตอบที่ลิงค์ด้านล่างนี้มีรายละเอียดเล็ก ๆ น้อย ๆ เกี่ยวกับสฟิงซ์ซึ่งใช้กับ Solr ด้วย เปรียบเทียบเครื่องมือค้นหาข้อความแบบเต็ม - Lucene, Sphinx, Postgresql, MySQL?

Solr ยังมีคุณสมบัติเพิ่มเติมดังต่อไปนี้:

  1. รองรับการจำลองแบบ
  2. หลายคอร์ (คิดว่าสิ่งเหล่านี้เป็นฐานข้อมูลแยกต่างหากที่มีการกำหนดค่าของตัวเองและดัชนีของตัวเอง)
  3. บูลีนค้นหา
  4. การเน้นคำหลัก (ค่อนข้างง่ายที่จะทำในรหัสแอปพลิเคชันถ้าคุณมี regex-fu อย่างไรก็ตามทำไมไม่ให้เครื่องมือพิเศษทำงานได้ดีกว่าสำหรับคุณ)
  5. อัปเดตดัชนีผ่าน XML หรือไฟล์ที่มีการคั่น
  6. สื่อสารกับเซิร์ฟเวอร์การค้นหาผ่าน HTTP (สามารถส่งคืน Json, Native PHP / Ruby / Python)
  7. PDF, การจัดทำดัชนีเอกสาร Word
  8. ฟิลด์แบบไดนามิก
  9. แง่มุม
  10. รวมฟิลด์
  11. หยุดคำคำพ้องความหมาย ฯลฯ
  12. มากขึ้นเช่นนี้ ...
  13. สร้างดัชนีโดยตรงจากฐานข้อมูลด้วยแบบสอบถามแบบกำหนดเอง
  14. Auto-แนะนำ
  15. การเก็บข้อมูลอัตโนมัติของแคช
  16. การจัดทำดัชนีอย่างรวดเร็ว (เปรียบเทียบกับการจัดทำดัชนีการค้นหาข้อความแบบเต็ม MySQL) - Lucene ใช้รูปแบบดัชนีการกลับรายการแบบไบนารี
  17. การเพิ่ม (กฎที่กำหนดเองเพื่อเพิ่มความเกี่ยวข้องของคำหลักหรือวลีใด ๆ ฯลฯ )
  18. การค้นหาแบบ Fielded (หากผู้ใช้การค้นหารู้ว่าต้องการค้นหาหรือไม่พวกเขาจะทำการค้นหาที่แคบลงโดยพิมพ์ฟิลด์จากนั้นเลือกค่าและเฉพาะฟิลด์นั้นที่ค้นหามากกว่าทุกอย่าง - ประสบการณ์การใช้งานที่ดีกว่ามาก)

BTW มีฟีเจอร์มากมาย อย่างไรก็ตามฉันได้แสดงรายการคุณสมบัติที่ฉันใช้จริงในการผลิต BTW ออกนอกกรอบ MySQL รองรับ # 1, # 3 และ # 11 (จำกัด ) ในรายการด้านบน สำหรับคุณสมบัติที่คุณต้องการฐานข้อมูลเชิงสัมพันธ์จะไม่ลดลง ฉันจะกำจัดพวกนั้นทันที

นอกจากนี้ข้อดีอีกอย่างคือ Solr (ดีจริง ๆ แล้ว Lucene) เป็นฐานข้อมูลเอกสาร (เช่น NoSQL) ประโยชน์มากมายของฐานข้อมูลเอกสารอื่นใดที่สามารถรับรู้ได้ด้วย Solr คุณสามารถใช้งานได้มากกว่าการค้นหา (เช่นประสิทธิภาพ) สร้างสรรค์กับมัน :)


สฟิงซ์เช่นกันเกี่ยวกับรองรับการทำซ้ำหลายแกนค้นหาบูลีนไฮไลต์ของคำหลักปรับปรุงดัชนีผ่าน XML - หรือไฟล์ที่คั่นด้วย - PDF, การจัดทำดัชนีเอกสาร Word (ผ่าน xml) Facets หยุดคำคำพ้องความหมาย ฯลฯ ดัชนีโดยตรงจากฐานข้อมูล การจัดทำดัชนีการส่งเสริมการค้นหาที่มีเขตข้อมูลเกี่ยวกับเขตข้อมูลไดนามิกรวมเขตข้อมูลแคช Autowarming ฉันไม่รู้
Moosh

58

Apache Solr


นอกเหนือจากการตอบแบบสอบถามของ OP ให้ฉันแสดงความคิดเห็นเชิงลึกเกี่ยวกับApache Solrจากการแนะนำเบื้องต้นไปจนถึงการติดตั้งและการใช้งานโดยละเอียด

คำแนะนำง่ายๆ


ทุกคนที่เคยมีประสบการณ์กับเครื่องมือค้นหาด้านบนหรือเครื่องมืออื่น ๆ ที่ไม่ได้อยู่ในรายชื่อ - ฉันชอบที่จะได้ยินความคิดเห็นของคุณ

ไม่ควรใช้Solrเพื่อแก้ปัญหาแบบเรียลไทม์ สำหรับเครื่องมือค้นหาSolrเป็นเกมสวยมากและทำงานได้อย่างไม่มีที่ติ

Solrทำงานได้ดีกับแอปพลิเคชันบนเว็บ High Traffic ( ฉันอ่านบางที่ไม่เหมาะกับสิ่งนี้ แต่ฉันสำรองข้อมูลคำสั่งนั้น ) มันใช้แรมไม่ใช่ซีพียู

  • ความเกี่ยวข้องของผลลัพธ์และการจัดอันดับ

การเพิ่มประสิทธิภาพช่วยให้คุณจัดอันดับผลลัพธ์ของคุณปรากฏอยู่ด้านบน บอกว่าคุณกำลังพยายามที่จะค้นหาชื่อจอห์นในเขตFirstNameและนามสกุลและคุณต้องการที่จะให้ความเกี่ยวข้องกับFirstNameฟิลด์แล้วคุณจะต้องเพิ่มขึ้นFirstNameข้อมูลตามที่ปรากฏ

http://localhost:8983/solr/collection1/select?q=firstname:john^2&lastname:john

อย่างที่คุณเห็นฟิลด์ชื่อจะเพิ่มขึ้นด้วยคะแนน 2

เพิ่มเติมเกี่ยวกับSolrRelevancy

  • การค้นหาและการจัดทำดัชนีความเร็ว

ความเร็วนั้นเร็วอย่างไม่น่าเชื่อและไม่ประนีประนอมกับสิ่งนั้น เหตุผลที่ผมย้ายไปSolr

เกี่ยวกับความเร็วการจัดทำดัชนีSolrยังสามารถจัดการJOINSจากตารางฐานข้อมูลของคุณ การเข้าร่วมที่สูงและซับซ้อนจะส่งผลต่อความเร็วในการจัดทำดัชนี อย่างไรก็ตามการกำหนดค่าRAMมหาศาลสามารถจัดการสถานการณ์นี้ได้อย่างง่ายดาย

ยิ่ง RAM สูงเท่าไรความเร็วในการจัดทำดัชนีของ Solr ก็จะเร็วขึ้นเท่านั้น

  • ใช้งานง่ายและใช้งานง่ายด้วย Django

ไม่เคยพยายามผสานรวมSolrและDjango เข้าด้วยกัน แต่คุณสามารถทำเช่นนั้นกับHaystackได้ ฉันพบบทความที่น่าสนใจเหมือนกันและนี่คือgithubสำหรับมัน

  • ข้อกำหนดด้านทรัพยากร - ไซต์จะโฮสต์บน VPS ดังนั้นเครื่องมือค้นหาจึงไม่จำเป็นต้องใช้ RAM และ CPU จำนวนมาก

Solrสายพันธุ์บน RAM, RAM ดังนั้นหากอยู่ในระดับสูงคุณไม่ต้องกังวลเกี่ยวกับSolr

การใช้ RAM ของ Solrถ่ายทำดัชนีอย่างเต็มรูปแบบหากคุณมีระเบียนหลายพันล้านรายการคุณสามารถใช้การนำเข้า Delta เพื่อจัดการสถานการณ์นี้ได้อย่างชาญฉลาด ตามที่อธิบายSolr เป็นเพียงการแก้ปัญหาแบบ real-time ซึ่งอยู่ใกล้กับ

  • ความยืดหยุ่น

Solrสามารถปรับขนาดได้อย่างมาก มีลักษณะในSolrCloud คุณสมบัติที่สำคัญบางประการของมัน

  • Shards (หรือ sharding) เป็นแนวคิดของการกระจายดัชนีระหว่างเครื่องหลาย ๆ เครื่องบอกว่าดัชนีของคุณใหญ่เกินไปหรือไม่
  • โหลดบาลานซ์ (ถ้าใช้Solrjกับเมฆ Solr มันจะดูแลโหลดบาลานซ์อัตโนมัติโดยใช้กลไก Round-Robin)
  • การค้นหาแบบกระจาย
  • ความพร้อมใช้งานสูง
  • คุณสมบัติพิเศษเช่น "คุณหมายถึงอะไร" การค้นหาที่เกี่ยวข้อง ฯลฯ

สำหรับสถานการณ์ข้างต้นคุณสามารถใช้SpellCheckComponentที่แน่นขึ้นด้วยSolr มีจำนวนมากที่มีคุณสมบัติอื่น ๆ ที่SnowballPorterFilterFactoryจะช่วยให้การเรียกระเบียนบอกว่าถ้าคุณพิมพ์, หนังสือแทนหนังสือคุณจะนำเสนอกับผลที่เกี่ยวข้องกับหนังสือ


คำตอบนี้ในวงกว้างมุ่งเน้นไปที่Apache SolrและMySQL Django อยู่นอกขอบเขต

สมมติว่าคุณอยู่ภายใต้สภาพแวดล้อมของ LINUX คุณสามารถดำเนินการต่อในบทความนี้เพิ่มเติม (mine เป็นรุ่น Ubuntu 14.04)

รายละเอียดการติดตั้ง

เริ่มต้นใช้งาน

ดาวน์โหลดApache Solrจากที่นี่ ที่จะเป็นรุ่น4.8.1 คุณสามารถดาวน์โหลดเวอร์ชั่นใหม่ได้ฉันพบว่ามันเสถียร

หลังจากดาวน์โหลดไฟล์เก็บถาวรแล้วให้แตกไฟล์ลงในโฟลเดอร์ที่คุณต้องการ พูด .. Downloadsหรืออะไรก็ได้ .. ดังนั้นมันจะเป็นอย่างไรDownloads/solr-4.8.1/

ตามคำแนะนำของคุณ .. นำทางภายในไดเรกทอรี

shankar@shankar-lenovo: cd Downloads/solr-4.8.1

ดังนั้นตอนนี้คุณอยู่ที่นี่ ..

shankar@shankar-lenovo: ~/Downloads/solr-4.8.1$

เริ่ม Jetty Application Server

ท่าเทียบเรือมีอยู่ในโฟลเดอร์ตัวอย่างของsolr-4.8.1ไดเรกทอรีดังนั้นเข้าไปข้างในและเริ่ม Jetty Application Server

shankar@shankar-lenovo:~/Downloads/solr-4.8.1/example$ java -jar start.jar

ตอนนี้อย่าปิดเทอร์มินัลย่อเล็กสุดแล้วปล่อยให้มันอยู่ข้างๆ

(เคล็ดลับ: ใช้ & หลัง start.jar เพื่อให้ Jetty Server ทำงานในพื้นหลัง)

เพื่อตรวจสอบว่าApache Solrทำงานได้สำเร็จหรือไม่โปรดไปที่ URL นี้บนเบราว์เซอร์ http: // localhost: 8983 / Solr

รัน Jetty บนพอร์ตที่กำหนดเอง

มันทำงานบนพอร์ต 8983 เป็นค่าเริ่มต้น คุณสามารถเปลี่ยนพอร์ตได้ทั้งที่นี่หรือภายในjetty.xmlไฟล์โดยตรง

java -Djetty.port=9091 -jar start.jar

ดาวน์โหลด JConnector

ไฟล์ JAR นี้ทำหน้าที่เป็นสะพานเชื่อมระหว่างMySQLและ JDBC ให้ดาวน์โหลดเวอร์ชั่นแพลตฟอร์มอิสระที่นี่

หลังจากดาวน์โหลดแล้วให้แตกโฟลเดอร์แล้วคัดลอกmysql-connector-java-5.1.31-bin.jarและวางลงในไดเรกทอรีlib

shankar@shankar-lenovo:~/Downloads/solr-4.8.1/contrib/dataimporthandler/lib

การสร้างตาราง MySQL เพื่อเชื่อมโยงกับ Apache Solr

ในการทำให้Solrใช้คุณจำเป็นต้องมีตารางและข้อมูลเพื่อค้นหา สำหรับสิ่งนั้นเราจะใช้MySQLในการสร้างตารางและผลักดันชื่อแบบสุ่มและจากนั้นเราสามารถใช้Solrเพื่อเชื่อมต่อกับMySQLและสร้างดัชนีตารางนั้นและรายการของมัน

1. โครงสร้างตาราง

CREATE TABLE test_solr_mysql
 (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  name VARCHAR(45) NULL,
  created TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id)
 );

2. กำหนดตารางด้านบน

INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jean');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jack');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jason');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Vego');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Grunt');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jasper');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Fred');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jenna');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Rebecca');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Roland');

เข้าไปในแกนกลางและเพิ่มคำสั่ง lib

1. นำทางไปยัง

shankar@shankar-lenovo: ~/Downloads/solr-4.8.1/example/solr/collection1/conf

2. การแก้ไข solrconfig.xml

เพิ่มคำสั่งทั้งสองนี้ลงในไฟล์นี้ ..

  <lib dir="../../../contrib/dataimporthandler/lib/" regex=".*\.jar" />
  <lib dir="../../../dist/" regex="solr-dataimporthandler-\d.*\.jar" />

ตอนนี้เพิ่มDIH (ตัวจัดการการนำเข้าข้อมูล)

<requestHandler name="/dataimport" 
  class="org.apache.solr.handler.dataimport.DataImportHandler" >
    <lst name="defaults">
      <str name="config">db-data-config.xml</str>
    </lst>
</requestHandler>

3. สร้างไฟล์ db-data-config.xml

หากไฟล์นั้นมีอยู่แล้วละเว้นให้เพิ่มบรรทัดเหล่านี้ในไฟล์นั้น ในขณะที่คุณสามารถเห็นบรรทัดแรกคุณจะต้องให้ข้อมูลประจำตัวของฐานข้อมูลMySQLของคุณ ชื่อฐานข้อมูลชื่อผู้ใช้และรหัสผ่าน

<dataConfig>
    <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/yourdbname" user="dbuser" password="dbpass"/>
    <document>
   <entity name="test_solr" query="select CONCAT('test_solr-',id) as rid,name from test_solr_mysql WHERE '${dataimporter.request.clean}' != 'false'
      OR `created` > '${dataimporter.last_index_time}'" >
    <field name="id" column="rid" />
    <field name="solr_name" column="name" />
    </entity>
   </document>
</dataConfig>

(เคล็ดลับ: คุณสามารถมีเอนทิตีจำนวนเท่าใดก็ได้ แต่ต้องระวังช่อง id หากเหมือนกันการทำดัชนีจะข้ามไป)

4. แก้ไขไฟล์ schema.xml

เพิ่มสิ่งนี้ในschema.xmlของคุณตามที่แสดง ..

<uniqueKey>id</uniqueKey>
<field name="solr_name" type="string" indexed="true" stored="true" />

การดำเนินงาน

การจัดทำดัชนี

นี่คือที่จัดการจริง คุณต้องทำดัชนีข้อมูลจากMySQLไปยังSolr inorder เพื่อใช้ประโยชน์ของ Solr Queries

ขั้นตอนที่ 1: ไปที่แผงควบคุมของ Solr

กด URL http: // localhost: 8983 / solrบนเบราว์เซอร์ของคุณ หน้าจอเปิดเช่นนี้

นี่คือแผงควบคุมหลักของ Apache Solr

ตามที่เครื่องหมายระบุไว้ให้ไปที่การเข้าสู่ระบบเพื่อตรวจสอบว่าการกำหนดค่าใด ๆ ข้างต้นทำให้เกิดข้อผิดพลาดหรือไม่

ขั้นตอนที่ 2: ตรวจสอบบันทึกของคุณ

ตกลงตอนนี้คุณอยู่ที่นี่คุณสามารถมีข้อความสีเหลืองจำนวนมาก (คำเตือน) ตรวจสอบให้แน่ใจว่าคุณไม่มีข้อความแสดงข้อผิดพลาดเป็นสีแดง ก่อนหน้านี้ในการกำหนดค่าของเราเราได้เพิ่มแบบสอบถามแบบใช้เลือกข้อมูลบนdb-data-config.xml ของเรากล่าวว่าหากมีข้อผิดพลาดใด ๆ ในแบบสอบถามนั้นจะปรากฏที่นี่

นี่คือส่วนการบันทึกของเอ็นจิ้น Apache Solr ของคุณ

ดีไม่มีข้อผิดพลาด เราไปได้ดี ลองเลือกcollection1จากรายการตามที่ปรากฎแล้วเลือกDataimport

ขั้นตอนที่ 3: DIH (ตัวจัดการการนำเข้าข้อมูล)

ใช้กำที่คุณจะได้รับการเชื่อมต่อกับMySQLจากSolrผ่านแฟ้มการกำหนดค่าฐานข้อมูลข้อมูล-config.xmlจากSolrอินเตอร์เฟซและดึง 10 ระเบียนจากฐานข้อมูลที่ได้รับการจัดทำดัชนีบนSolr

ต้องการทำเช่นนั้นเลือกเต็มรูปแบบในการนำเข้าและตรวจสอบตัวเลือกที่สะอาดและCommit ตอนนี้คลิกดำเนินการตามที่แสดง

หรือคุณสามารถใช้แบบสอบถามนำเข้าแบบเต็มโดยตรงเช่นนี้ได้เช่นกัน ..

http://localhost:8983/solr/collection1/dataimport?command=full-import&commit=true

ตัวจัดการการนำเข้าข้อมูล

หลังจากที่คุณคลิกExecute , Solrเริ่มดัชนีระเบียนถ้ามีข้อผิดพลาดใด ๆ ก็จะบอกว่าการจัดทำดัชนีไม่และคุณจะต้องกลับไปเข้าสู่ระบบเพื่อดูสิ่งที่ผิดพลาดไปแล้ว

สมมติว่าไม่มีข้อผิดพลาดกับการกำหนดค่านี้และหากการจัดทำดัชนีเสร็จสมบูรณ์คุณจะได้รับการแจ้งเตือนนี้

ความสำเร็จในการทำดัชนี

ขั้นตอนที่ 4: เรียกใช้แบบสอบถาม Solr

ดูเหมือนว่าทุกอย่างเป็นไปด้วยดีตอนนี้คุณสามารถใช้Solr Queries เพื่อสืบค้นข้อมูลที่ถูกทำดัชนี คลิกQueryทางด้านซ้ายจากนั้นกดปุ่มExecuteที่ด้านล่าง

คุณจะเห็นบันทึกการจัดทำดัชนีตามที่แสดง

แบบสอบถามSolr ที่สอดคล้องกันสำหรับการแสดงรายการระเบียนทั้งหมดคือ

http://localhost:8983/solr/collection1/select?q=*:*&wt=json&indent=true

ข้อมูลที่จัดทำดัชนี

มีการบันทึกดัชนีทั้งหมด 10 รายการ สมมติว่าเราต้องการชื่อที่ขึ้นต้นด้วยJaเท่านั้นในกรณีนี้คุณต้องกำหนดเป้าหมายชื่อคอลัมน์solr_nameดังนั้นข้อความค้นหาของคุณจะเป็นเช่นนี้

http://localhost:8983/solr/collection1/select?q=solr_name:Ja*&wt=json&indent=true

ข้อมูล JSON เริ่มต้นด้วย Ja *

นั่นคือวิธีที่คุณเขียนแบบสอบถามSolr เพื่ออ่านข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้, ตรวจสอบที่สวยงามนี้บทความ


3
@Downvoter อย่าลังเลที่จะแสดงความคิดเห็นหรือแก้ไขคำตอบนี้และการใช้เหตุผลสำหรับ downvote จะช่วยผู้อื่นเช่นกัน
Shankar Damodaran

4
นี่เป็นหนึ่งในโพสต์ที่มีเนื้อหาครอบคลุมและเป็นระเบียบมากที่สุดที่ฉันเคยเห็นใน SO สุดยอดงาน
ลง

28

ฉันกำลังดูการค้นหาข้อความแบบเต็ม PostgreSQL ในขณะนี้และมันมีคุณสมบัติที่เหมาะสมของเครื่องมือค้นหาที่ทันสมัยตัวละครที่ขยายได้ดีมากและการสนับสนุนหลายภาษาการรวมที่ดีกับฟิลด์ข้อความในฐานข้อมูล

แต่มันไม่มีโอเปอเรเตอร์การค้นหาที่เป็นมิตรเช่น + หรือ AND (ใช้ & |!) และฉันก็ไม่ได้ตื่นเต้นกับวิธีการทำงานบนไซต์เอกสารของพวกเขา แม้ว่าจะมีคำศัพท์จับคู่ในตัวอย่างผลลัพธ์ แต่อัลกอริทึมเริ่มต้นสำหรับคำที่ไม่ตรงกัน นอกจากนี้หากคุณต้องการทำดัชนี rtf, PDF, MS Office คุณจะต้องค้นหาและรวมตัวแปลงรูปแบบไฟล์

OTOH เป็นวิธีที่ดีกว่าการค้นหาข้อความ MySQL ซึ่งไม่ได้จัดทำดัชนีคำที่มีสามตัวอักษรหรือน้อยกว่า มันเป็นค่าเริ่มต้นสำหรับการค้นหา MediaWiki และฉันคิดว่ามันไม่ดีสำหรับผู้ใช้ปลายทาง: http://www.searchtools.com/analysis/mediawiki-search/

ในทุกกรณีที่ฉันเคยเห็น Lucene / Solr และ Sphinx นั้นยอดเยี่ยมมาก พวกมันเป็นรหัสที่มั่นคงและมีการพัฒนาพร้อมกับการปรับปรุงที่สำคัญในการใช้งานดังนั้นเครื่องมือทั้งหมดอยู่ที่นั่นเพื่อทำการค้นหาที่น่าพอใจเกือบทุกคน

สำหรับ SHAILI - SOLR รวมถึงไลบรารี่โค้ดการค้นหาของ Lucene และมีส่วนประกอบที่จะเป็นเอ็นจิ้นการค้นหาแบบสแตนด์อโลนที่ดี


1
ผมเชื่อว่าโดยเต็ม PostgreSQL Tsearchข้อความค้นหาที่คุณกำลังหมายถึง แต่ Tsearch ไม่สนับสนุนการค้นหาวลี ก็ยังคงอยู่ในรายชื่อสิ่งที่ต้องทำของพวกเขาsai.msu.su/~megera/wiki/FTS_Todo
Gnanam

1
เพิ่งทำการทดสอบแบบเต็มบน Postgres 9.0 การค้นหาข้อความแบบเต็ม รู้สึกผิดหวังที่พบว่าข้อความภาษาฝรั่งเศสไม่ตรงกันหากผู้ใช้ลืมใช้สำเนียงทั้งหมด การจับคู่ของแบบฟอร์มคำเป็นหย่อม - ตัวอย่างเช่นในภาษาอังกฤษ "พูด" ไม่ตรงกับข้อความที่มี "กล่าวว่า" โดยรวมแล้วค่อนข้างน่าประทับใจ แต่สำหรับคุณสมบัติที่รวมในทุกภาษาที่ทดสอบ (en, fr, ru)
Roman Starkov

9
@romkyns: คุณต้องติดตั้งพจนานุกรมที่ไม่มีค่าเพื่อตัดออก
เดนิสเดอเบอร์นาดี

2
"OTOH เป็นวิธีที่ดีกว่าการค้นหาข้อความ MySQL ซึ่งไม่แม้แต่จัดทำดัชนีคำที่มีตัวอักษรสามตัวหรือน้อยกว่า" นั่นไม่ใช่ข้อ จำกัด ในตัวของ MySQL - เป็นสิ่งที่คุณกำหนดไว้ในไฟล์ปรับแต่ง หากคุณต้องการจัดทำดัชนีคำหนึ่งตัวอักษรเพียงแค่เปลี่ยนค่าหนึ่งค่าในการกำหนดค่า
Canuck

1
เป็นกังวลว่าผู้คนกำลังทำการเปรียบเทียบฐานข้อมูลที่พวกเขายังไม่ได้สำรวจอย่างเต็มที่ MySQL สามารถจัดทำดัชนีคำที่มีอักขระสามตัวหรือน้อยกว่า - คุณเพียงแค่ต้องกำหนดค่าอย่างถูกต้อง
TheCarver

22

แค่สองเซ็นต์ของฉันกับคำถามที่เก่ามากนี้ ฉันจะขอแนะนำการดูที่ElasticSearch

Elasticsearch เป็นเซิร์ฟเวอร์การค้นหาตาม Lucene มันมีเอ็นจิ้นการค้นหาข้อความแบบเต็มที่มีความสามารถหลากหลายที่มีอินเตอร์เฟซเว็บ RESTful และเอกสาร JSON ที่ปราศจากสคีมา Elasticsearch ได้รับการพัฒนาใน Java และเปิดตัวเป็นโอเพ่นซอร์สภายใต้เงื่อนไขของ Apache License

ข้อได้เปรียบเหนือกว่าเครื่องยนต์ FTS อื่น ๆ (ค้นหาข้อความแบบเต็ม) คือ:

  • ส่วนต่อประสาน RESTful
  • ความยืดหยุ่นที่ดีขึ้น
  • ชุมชนขนาดใหญ่
  • สร้างโดยนักพัฒนา Lucene
  • เอกสารประกอบที่กว้างขวาง
  • มีไลบรารี่โอเพ่นซอร์สมากมาย (รวมถึง Django)

เราใช้เครื่องมือค้นหานี้ในโครงการของเราและมีความสุขมากกับมัน


10

SearchTools-Avi กล่าวว่า "การค้นหาข้อความ MySQL ซึ่งไม่แม้แต่จัดทำดัชนีคำที่มีสามตัวอักษรหรือน้อยกว่า"

ปีงบประมาณ, MySQL เต็มความยาวคำต่ำสุดคำสามารถปรับตั้งแต่อย่างน้อย MySQL 5.0 Google 'mysql fulltext min length' สำหรับคำแนะนำง่ายๆ

ที่กล่าวว่า MySQL fulltext มีข้อ จำกัด : สำหรับหนึ่งมันจะช้าในการปรับปรุงเมื่อคุณไปถึงล้านระเบียนหรือมากกว่านั้น ...


2

ฉันจะเพิ่มmnoGoSearchลงในรายการ โซลูชันที่มีประสิทธิภาพและยืดหยุ่นสูงซึ่งทำงานเป็น Google: ตัวทำดัชนีเรียกข้อมูลจากหลายไซต์คุณสามารถใช้เกณฑ์พื้นฐานหรือประดิษฐ์ตะขอของคุณเองเพื่อให้มีคุณภาพการค้นหาสูงสุด อีกทั้งสามารถดึงข้อมูลโดยตรงจากฐานข้อมูล

การแก้ปัญหาไม่เป็นที่รู้จักในปัจจุบัน แต่มันสนองความต้องการสูงสุด คุณสามารถรวบรวมและติดตั้งหรือบนเซิร์ฟเวอร์แบบสแตนด์อโลนหรือแม้แต่บนเซิร์ฟเวอร์หลักของคุณไม่จำเป็นต้องใช้ ressources มากเท่ากับ Solr ตามที่เขียนใน C และทำงานได้อย่างสมบูรณ์แม้บนเซิร์ฟเวอร์ขนาดเล็ก

ในการเริ่มต้นคุณจำเป็นต้องรวบรวมมันด้วยตัวเองดังนั้นจึงต้องมีความรู้บางอย่าง ฉันสร้างสคริปต์เล็ก ๆสำหรับ Debian ซึ่งสามารถช่วยได้ ยินดีต้อนรับการปรับเปลี่ยนใด ๆ

ขณะที่คุณกำลังใช้กรอบ Django, คุณสามารถใช้ PHP หรือลูกค้าที่อยู่ตรงกลางหรือหาวิธีการแก้ปัญหาในหลามผมเห็นบาง บทความ

และแน่นอนว่า mnoGoSearch เป็นโอเพ่นซอร์ส GNU GPL

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.