ความตั้งใจของฉันในการสร้าง repo นี้คือการแบ่งปันความรู้สั้น ๆ ของฉันเกี่ยวกับเรื่องนี้: การค้นหาข้อความแบบเต็มหรือเพียงแค่ FTS อย่างที่คุณจะเห็นว่าฉันได้ทำการทดสอบและการวิจัยเพื่อให้ได้ข้อสรุปนั้นลิงก์บางส่วนในส่วนสุดท้ายสามารถช่วยให้ทุกคนที่ต้องการเข้าใจสิ่งที่ฉันได้อ่านและ (ทำไมไม่?) แม้กระทั่งช่วยและบริจาคบางอย่างให้กับที่เก็บข้อมูลนี้ (ชื่นชม PR)
ที่เก็บนี้มี Rails 6.x API ที่ใช้ Gem Searchkick เพื่อสร้างคำแนะนำที่ยอดเยี่ยม (โดย FTS) ตามการป้อนข้อมูลของผู้ใช้ มันเป็น HTTP API เล็ก ๆ ที่ช่วยให้คุณสร้างโพสต์ที่มีชื่อเรื่องและฟิลด์ร่างกาย (อย่างที่คุณจะเห็นในภายหลัง) และทำการค้นหาที่เข้าใกล้คำแนะนำที่ดีจริง ๆ ไม่เพียง แต่เปรียบเทียบการเปรียบเทียบสตริง เพื่อจุดประสงค์นั้นฉันจะเริ่มตรวจสอบว่ามีวิธีแก้ปัญหาอื่น ๆ สำหรับวิธี FTS นอกเหนือจาก Elasticsearch หรือไม่
"googling" ที่เรียบง่ายสามารถนำมาให้คุณหลายวิธีในการดำเนินการ FTS ใน DBMs ทั่วไปเช่น MySQL หรือ PostgreSQL การเลือกทางเลือกที่ผ่านการทดสอบและแพร่กระจายไปยัง "ใหม่" เป็นเรื่องดีกว่าเสมอ แม้แต่ Elasticsearch ไม่ใช่ เทคโนโลยีที่เกี่ยวกับชุมชนและความน่าเชื่อถือของซอฟต์แวร์ เหตุใดจึงไม่เลือก Bullet สีเงินเก่าระหว่าง PostgreSQL และ MySQL?
มีสองวิธีที่เราสามารถมี FTS ใน MySQL: การค้นหาภาษาธรรมชาติและการค้นหาบูลีน การค้นหาภาษานั้นชัดเจนยิ่งขึ้นสำหรับความเข้าใจของเราเพราะมันเป็นเพียงการค้นหาคำต่อคำเปรียบเทียบแบบสอบถามกับฟิลด์ที่คุณระบุ แถวที่มีการติดต่อกับสตริงการสืบค้นของคุณมากขึ้นจะทำคะแนนได้มากขึ้นและได้รับการจัดอันดับด้วยคะแนนนี้มาก คะแนนศูนย์หมายความว่าไม่มีการติดต่อและแถวนั้นจะไม่ถูกส่งคืนใน MySQL FTS ตรวจสอบตัวอย่างนี้ ( ส่วนที่ทำให้งงงวยที่อาจอ่อนไหว ):
SELECT CASE WHEN LENGTH(content) > 140
THEN CONCAT( SUBSTRING (content, 1 , 140 ), ' ... ' )
ELSE content
END AS adapted_content,
MATCH(content) AGAINST ( ' lei ' IN NATURAL LANGUAGE MODE) AS score
FROM posts;ใน วิธีบูลีน คุณสามารถใช้เครื่องมืออื่น ๆ ที่สามารถเปลี่ยน "คะแนน" สำหรับแต่ละคำแต่ละคำ การใช้โหมดภาษาธรรมชาติคุณสามารถค้นหาการจับคู่ที่ดีและง่ายต่อการใช้งานส่วนใหญ่ถ้าเราเปรียบเทียบกับโหมดบูลีน แต่สิ่งนี้ไม่ครอบคลุมกรณีการใช้งานเมื่อผู้ใช้พิมพ์อินพุตไม่ถูกต้อง ดังนั้นจึงคาดหวังจากผู้ใช้ วิธีการเขียนที่แม่นยำ - และนี่ไม่ใช่ความจริง กรณีเดียวกันสำหรับ PostgreSQL: มีบางวิธีที่คุณสามารถทำ FTS ได้ แต่ ที่นี่เรามีปัญหาที่เราสามารถแก้ไขได้โดย การวิเคราะห์สตริงที่ลึกกว่า ดูเมื่อเราเปลี่ยน 'lei' เป็น 'le' (ลบ 'ฉัน') ซึ่งเกิดขึ้นกับคะแนนของเรา:
เพื่อแก้ปัญหานี้ Elasticsearches ได้ใช้งาน FTS กับ Java Lucene Engine มันนำเครื่องมือมากมายมาให้เราเช่นการตีความการสะกดคำผิดที่เกิดขึ้นและตัวละครพิเศษ - como acentos na minha línguapátria! - และอื่น ๆ ทุกสิ่งนี้อาจซับซ้อนในการพัฒนาด้วยตัวเราเองดังนั้นจึงเป็นการใช้ Elasticsearch อย่างสมเหตุสมผลหากคุณค้นหาเครื่องมือเหล่านั้น
$ gem install bundler
$ git clone [email protected]:abmBispo/rails-autocomplete.git
$ cd rails-autocomplete
$ bundle installมันง่ายมากที่จะเรียกใช้คอนเทนเนอร์ของการพึ่งพาบริการ Rails นี้ - PostgreSQL และ Elasticsearch - แทนที่จะติดตั้งในเครื่องของคุณ มันสามารถช่วยให้คุณจัดการกับกระบวนการและหน่วยความจำและการบริหารการจัดเก็บข้อมูลได้ดีขึ้น ดังนั้นที่นี่คุณมีตัวอย่างที่จะทำอย่างนั้น:
$ docker run --name postgres-database -e POSTGRES_PASSWORD=postgres -d -p 5432:5432 -v $HOME /docker/volumes/postgres:/var/lib/postgresql/data postgres
$ docker run --name elasticsearch -p 9200:9200 -p 9300:9300 -d -e " discovery.type=single-node " docker.elastic.co/elasticsearch/elasticsearch:7.6.2หากคุณยังใหม่กับ Docker และมีเพียงภาพที่ทำงานอยู่คุณสามารถปิดได้โดยการดำเนินการเท่านั้น:
$ sudo docker stop $( sudo docker ps -a -q )และเปิดอีกครั้งด้วย:
$ sudo docker start $( sudo docker ps -a -q -f " status=exited " ) $ bin/rails db:create db:migrate db:seed $ bin/rails sที่นี่คุณสามารถรับเอกสารสั้น ๆ เกี่ยวกับบุรุษไปรษณีย์ผ่านการค้นหาและสร้าง API