2016-01-07 9 views
5

जब एक दस्तावेज़ में "हैरिसन फोर्ड" खोजने की कोशिश कर, pg_search किसी भी पाठ है कि उदाहरण के लिए 'हैरिसन' और 'फोर्ड', शामिल वापस आ जाएगी:खोज पदों की pg_search सटीक मिलान

pg_search_scope :search_by_full_name, :against => [:first_name, :last_name] 

People.search_by_full_name ("हैरिसन फोर्ड")

लौट सकते हैं:

जॉर्ज हैरिसन ड्राइव फोर्ड फोकस

मैं कैसे सुनिश्चित कर सकता हूं कि 'Harrison Ford' का सटीक मिलान वापस आएगा?

उत्तर

1

आप pg_search normalization, या मूल रूप से ranking search results Postgres में उपयोग करने के लिए की जरूरत है। मैं भी निम्न उदाहरण में सामान्य कारक का उपयोग नहीं किया:

SELECT ts_rank_cd(vector,query) as rank 
FROM 
    to_tsvector('simple','George Harrison drives a Ford Focus') as vector, 
    to_tsquery('simple','Harrison & Ford') as query; 

आउटपुट 1: -:

SELECT ts_rank_cd(vector,query) as rank 
FROM 
    to_tsvector('simple','Harrison Ford drives a car') as vector, 
    to_tsquery('simple','Harrison & Ford') as query; 

आउटपुट

rank  
----------- 
0.0333333 
(1 row) 

आप Harrison और Ford एक साथ है, तो रैंक अधिक होगी 2:

rank 
------ 
    0.1 
(1 row) 

यदि आप ORDER BY rank DESC सभी खोज परिणामों को प्राप्त करते हैं, तो आपको वह चाहिए जो आपको चाहिए, क्योंकि एक दूसरे के बगल में मौजूद सभी खोज शब्द उच्चतम rank होंगे और आपकी खोज परिणाम सूची के शीर्ष पर होंगे।

+0

क्षमा करें, मुझे सामान्यीकरण एल्गोरिदम विकल्पों को समझ में नहीं आता है। सटीक मिलान के अलावा किसी और चीज को नजरअंदाज करने के लिए मैं किस सीमा को निर्धारित करता हूं? – Ashbury

+0

यहां बिंदु यह है कि यदि आप रैंक डीईएससी द्वारा ऑर्डर करते हैं तो आप उच्चतम रैंक वाले शब्दों में उच्चतम रैंक होंगे - आपको जो चाहिए वह शीर्ष पर पहुंच जाएगा; मेरे उदाहरण में मैंने सामान्यीकरण कारक @ एशबरी –

+0

का भी उपयोग नहीं किया था समस्या यह है कि यह अभी भी मूल मैचों के करीब कितने करीब है, यह निकटतम मैचों की श्रृंखला (और कोई सटीक मिलान) वापस नहीं कर सकता है। यहां तक ​​कि अगर मैंने शीर्ष परिणाम लिया तो भी इसकी सटीक मिलान की कोई गारंटी नहीं है। – Ashbury

संबंधित मुद्दे