คำค้นหาทั้งหมดต้องอยู่ในพจนานุกรมหรือไม่
ไม่เพราะมีเพียงคำที่เกิดขึ้น (ตามการกำหนดค่าการค้นหาข้อความที่ใช้) อยู่ในดัชนีเพื่อเริ่มต้น แต่ที่สำคัญกว่า:
ไม่ เพราะที่ด้านบนของการค้นหาข้อความแบบเต็มนั้นก็สามารถจับคู่คำนำหน้าได้ :
สิ่งนี้จะได้ผล:
SELECT id, subject
FROM mailboxes
WHERE tsv @@ to_tsquery('simple', 'avail:*')
ORDER BY id DESC;
หมายเหตุ3สิ่ง:
ใช้to_tsquery()
ไม่ใช่plainto_tsquery()
ในกรณีนี้เพราะ ( อ้างถึงคู่มือ ):
... plainto_tsquery
จะไม่รู้จักtsquery
ตัวดำเนินการป้ายกำกับน้ำหนักหรือฉลากจับคู่คำนำหน้าในข้อมูลที่ป้อน
ใช้การ'simple'
กำหนดค่าการค้นหาข้อความเพื่อสร้างtsquery
สิ่งที่ชัดเจนเนื่องจากคุณต้องการใช้คำว่า'ประโยชน์'อย่างที่เป็นอยู่และไม่ได้ใช้การกั้น
ผนวก:*
เพื่อทำให้เป็นการค้นหาคำนำหน้าเช่นค้นหาคำศัพท์ทั้งหมดที่เริ่มต้นด้วย 'ประโยชน์'
สำคัญ: นี่คือการค้นหาคำนำหน้าคำศัพท์ (stems คำ) ในเอกสาร การจับคู่นิพจน์ทั่วไปที่ไม่มี wildcard ( content ~* 'avail'
) ไม่เหมือนกันทุกประการ! หลังไม่ได้ยึดติดกับด้านซ้าย (จนถึงจุดเริ่มต้นของคำศัพท์) และจะพบ 'FOOavail' เป็นต้น
มันไม่ชัดเจนว่าคุณต้องการให้พฤติกรรมที่ระบุไว้ในแบบสอบถามของคุณหรือเทียบเท่าของการแสดงออกปกติเพิ่ม ดัชนี Trigram ( pg_trgm
) เช่น@Evan ที่แนะนำไปแล้วเป็นเครื่องมือที่เหมาะสมสำหรับสิ่งนั้น มีคำถามที่เกี่ยวข้องจำนวนมากใน dba.SE จะพยายามค้นหา
ข้อมูลทั่วไป:
การสาธิต
SELECT *
FROM (
VALUES
('Zend has no framework')
, ('Zend Framework')
) sub(t), to_tsvector(t) AS tsv
WHERE tsv @@ to_tsquery('zend <-> fram:*');
id | t | tsv
----+----------------+------------------------
2 | Zend Framework | 'framework':2 'zend':1
คำตอบที่เกี่ยวข้องล่าสุด (บทที่วิธีที่แตกต่างเพื่อเพิ่มประสิทธิภาพการค้นหา ):
อีเมล์?
เนื่องจากคุณพูดถึงอีเมลโปรดทราบว่าตัวแยกวิเคราะห์การค้นหาข้อความจะระบุอีเมลและจะไม่แยกออกเป็นคำ / lexemes แยกกัน พิจารณา:
SELECT ts_debug('english', 'xangr@some.domain.com')
(email,"Email address",xangr@some.domain.com,{simple},simple,{xangr@some.domain.com})
ฉันจะแทนที่ตัวคั่น@
และ.
ในอีเมลของคุณด้วย space ( ' '
) เพื่อจัดทำดัชนีคำที่มี
นอกจากนี้ตั้งแต่คุณจะจัดการกับชื่อในอีเมลไม่ได้กับภาษาอังกฤษ (หรือบางภาษาอื่น) คำพูดผมจะใช้'simple'
การตั้งค่าการค้นหาข้อความที่จะปิดกั้นและอื่น ๆภาษาคุณสมบัติ:
สร้างts_vector
คอลัมน์ด้วย:
SELECT to_tsvector('simple', translate('joe.xangr@some.domain.com', '@.', ' ')) AS tsv;
:*
บันทึกไว้และ 2) ไม่ควรพูดถึงการสร้างto_tsvector('simple'..)
มาพร้อมกับคำแนะนำที่การสอบถามในอนาคตของ TSV นั้นจะต้องมีการกำหนดค่า 'ง่าย' เกินไป tsquery? ฉันคิดว่าคุณควรอธิบายถึงการแตกกิ่งก้านของการปิดการใช้งานการกำเนิดใน tsvector / tsquery