मैं Oracle में एक पूर्ण-पाठ खोज को लागू करने का प्रयास कर रहा हूं, लेकिन मुझे समझ नहीं आ रहा है कि खोज क्वेरी को सही तरीके से कैसे बनाया जाए?

कार्य इस प्रकार है:

  1. यदि मैं एक शब्द लिख रहा हूँ, तो सभी प्रविष्टियाँ प्रदर्शित होनी चाहिए और प्रासंगिकता के अनुसार क्रमबद्ध की जानी चाहिए। इस मामले में, जब मेरी क्वेरी में "शब्द" होता है, तो खोज परिणामों को प्रासंगिकता के अनुसार क्रमबद्ध "dddwordddd", "word", "wordddd" और "dddword" प्रदर्शित करना चाहिए।
  2. यदि मैं एक खोज क्वेरी में कई शब्द लिख रहा हूं, तो परिणाम सभी शब्दों और कुछ क्वेरी दोनों से युक्त होना चाहिए। प्रासंगिकता द्वारा भी क्रमबद्ध।
  3. और शब्दों को समूहों में जोड़ना संभव होना चाहिए। उदाहरण के लिए, जब मैं शब्दों को उद्धरण चिह्नों में समाप्त करता हूं (या कोई अन्य आवरण, जैसे "/" या "["), तो ऐसी प्रविष्टि को शब्दों द्वारा अलग खोज के बिना सख्ती से खोजा जाना चाहिए।

मैं ABOUT ऑपरेटर का उपयोग करके इसका केवल एक हिस्सा लागू करने में सक्षम था। यह कार्य के दूसरे आइटम के लिए आदर्श रूप से अनुकूल है। अगर मैं एक प्रश्न लिखता हूं जैसे:

SELECT SCORE(1), name 
from table 
WHERE CONTAINS(name, 'ABOUT('some text')', 1) > 0 
ORDER BY SCORE(1) DESC;

तो मुझे निम्नलिखित परिणाम मिलेंगे:

some text
some
text

लेकिन मैं इसे एक वाक्यांश में खोज के साथ कैसे जोड़ सकता हूं (शब्दों द्वारा अलग खोज के बिना), और आंशिक घटनाओं की खोज के साथ (जैसे %word%)?

1
Roman Andreev 22 फरवरी 2019, 09:00

1 उत्तर

सबसे बढ़िया उत्तर

तो चलिए उदाहरण टेक्स्ट के साथ एक टेबल लोड करते हैं:

create table t (
  c1 varchar2(100)
);

insert into t values ( 'some text' );
insert into t values ( 'some' );
insert into t values ( 'text' );
insert into t values ( 'exact phrase text' );
insert into t values ( 'phrase text' );
insert into t values ( 'exact phrase text word' );
insert into t values ( 'exact some wordddd phrase ' );
insert into t values ( 'phrase exact text dddword' );

commit;

create index i 
  on t ( c1 )
  indextype is ctxsys.context;

1) आप स्ट्रिंग्स के भीतर स्ट्रिंग्स खोजने के लिए वाइल्डकार्ड का उपयोग कर सकते हैं:

SELECT SCORE(1), c1 
from   t
WHERE  CONTAINS( c1, '%word%', 1 ) > 0 
ORDER BY SCORE(1) DESC;

SCORE(1)   C1                           
         5 exact phrase text word       
         5 phrase exact text dddword    
         5 exact some wordddd phrase    

यदि आप सटीक स्ट्रिंग "शब्द" वाले टेक्स्ट को प्राथमिकता देना चाहते हैं, तो सटीक मिलान खोजने के लिए OR का उपयोग करें। सटीक मिलान रैंक उच्च सुनिश्चित करने के लिए, आप इस शब्द को वज़न ऑपरेटर के साथ "गुणा" करके भी वजन कर सकते हैं:

SELECT SCORE(1), c1 
from   t
WHERE  CONTAINS( c1, '%word% or word*2', 1 ) > 0 
ORDER BY SCORE(1) DESC;

SCORE(1)   C1                           
        11 exact phrase text word       
         5 phrase exact text dddword    
         5 exact some wordddd phrase  

2) के बारे में ऑपरेटर संबंधित शब्दों या वाक्यांशों की खोज करता है। उदाहरण के लिए, जब आप "टेक्स्ट" की खोज करते हैं, तो आप "स्ट्रिंग" सहित दस्तावेज़ों को वापस करने के लिए इसका उपयोग कर सकते हैं। यदि आप ऐसे टेक्स्ट की खोज करना चाहते हैं जिसमें किसी सूची से कोई भी शब्द शामिल हों, या वे एक साथ हों:

SELECT SCORE(1), c1 
from   t
WHERE  CONTAINS( c1, 'some OR text', 1 ) > 0 
ORDER BY SCORE(1) DESC;

SCORE(1)   C1                          
         3 some text                   
         3 text                        
         3 phrase exact text dddword   
         3 phrase text                 
         3 exact phrase text word      
         3 exact phrase text 

3) किसी विशेष वाक्यांश को खोजने के लिए, अपने में सटीक वाक्यांश दर्ज करें:

SELECT SCORE(1), c1 
from   t
WHERE  CONTAINS( c1, 'exact phrase', 1 ) > 0 
ORDER BY SCORE(1) DESC;

SCORE(1)   C1                       
         4 exact phrase text word   
         4 exact phrase text      

यदि आप ऐसे पाठ की खोज कर रहे हैं जिसमें उपरोक्त खोजों का कोई भी संयोजन शामिल है, तो आप उन सभी को एक CONTAINS कॉल में भरने का प्रयास कर सकते हैं। लेकिन CONTAINS को कॉल करना या अलग करना और आसान है। प्रत्येक के लिए तीसरे पैरामीटर के लिए एक नया मान प्रदान करें। फिर आप उसी मान को SCORE में पास करके इसके लिए स्कोर प्राप्त कर सकते हैं:

SELECT SCORE(1), SCORE(2), SCORE(3), 
       SCORE(1) + SCORE(2) + SCORE(3) tot_score,
       c1 
from   t
WHERE  CONTAINS( c1, 'exact phrase', 1 ) > 0 
OR     CONTAINS( c1, '%word% or word*2', 2 ) > 0 
OR     CONTAINS( c1, 'some or text', 3 ) > 0 
ORDER BY SCORE(1) + SCORE(2) + SCORE(3) DESC;

SCORE(1)   SCORE(2)   SCORE(3)   TOT_SCORE   C1                           
         4         11          3          18 exact phrase text word       
         0          5          3           8 phrase exact text dddword    
         4          0          3           7 exact phrase text            
         0          5          0           5 exact some wordddd phrase    
         0          0          3           3 text                         
         0          0          3           3 some text                    
         0          0          3           3 phrase text  

अगर आप और जानना चाहते हैं, तो दस्तावेज़ों में क्वेरी ऑपरेटर शामिल हैं

2
Chris Saxon 22 फरवरी 2019, 08:41