ฉันเจอการค้นหาข้อความแบบเต็มใน postgres ในไม่กี่วันที่ผ่านมาและฉันสับสนเล็กน้อยเกี่ยวกับการจัดทำดัชนีเมื่อค้นหาในหลายคอลัมน์
เอกสาร postgres พูดคุยเกี่ยวกับการสร้างts_vector
ดัชนีในคอลัมน์ที่ต่อกันเช่น:
CREATE INDEX pgweb_idx ON pgweb
USING gin(to_tsvector('english', title || ' ' || body));
ซึ่งฉันสามารถค้นหาดังนี้:
... WHERE
(to_tsvector('english', title||' '||body) @@ to_tsquery('english', 'foo'))
อย่างไรก็ตามหากฉันต้องการค้นหาเฉพาะชื่อบางครั้งแค่เนื้อหาและบางครั้งทั้งสองฉันจะต้องมีดัชนีแยก 3 ตัว และถ้าฉันเพิ่มในคอลัมน์ที่สามนั่นอาจเป็น 6 ดัชนีและอื่น ๆ
อีกทางเลือกหนึ่งที่ฉันไม่ได้เห็นในเอกสารเป็นเพียงการจัดทำดัชนีสองคอลัมน์แยกกันจากนั้นใช้WHERE...OR
แบบสอบถามปกติ:
... WHERE
(to_tsvector('english', title) @@ to_tsquery('english','foo'))
OR
(to_tsvector('english', body) @@ to_tsquery('english','foo'))
การเปรียบเทียบทั้งสองแถวบน ~ 1 ล้านแถวดูเหมือนจะไม่มีประสิทธิภาพที่แตกต่างกัน
ดังนั้นคำถามของฉันคือ:
เหตุใดฉันจึงต้องการเชื่อมดัชนีเข้าด้วยกันเช่นนี้แทนที่จะสร้างดัชนีคอลัมน์แยกกัน? ข้อดี / ข้อเสียของทั้งคู่คืออะไร
การคาดเดาที่ดีที่สุดของฉันคือถ้าฉันรู้ล่วงหน้าฉันจะต้องการค้นหาทั้งสองคอลัมน์เท่านั้น (ไม่ทีละครั้ง) ฉันจะต้องการเพียงดัชนีเดียวโดยการต่อข้อมูลที่ใช้หน่วยความจำน้อยลง
title
เข้าไปในbody
แล้วจัดทำดัชนีที่จะให้คุณค่ามากแม้ว่าฉันจะเปิดการแก้ไข ฉันอาจจะติดดัชนีแยกกัน นอกจากนี้หากมีข้อผิดพลาดอย่างใดอย่างหนึ่งที่ต้องการให้คุณต่อกันฉันคิดว่าคุณสามารถเรียกใช้คิวรีแบบเฉพาะกิจได้