मैं Oracle में एक पूर्ण-पाठ खोज को लागू करने का प्रयास कर रहा हूं, लेकिन मुझे समझ नहीं आ रहा है कि खोज क्वेरी को सही तरीके से कैसे बनाया जाए?
कार्य इस प्रकार है:
- यदि मैं एक शब्द लिख रहा हूँ, तो सभी प्रविष्टियाँ प्रदर्शित होनी चाहिए और प्रासंगिकता के अनुसार क्रमबद्ध की जानी चाहिए। इस मामले में, जब मेरी क्वेरी में "शब्द" होता है, तो खोज परिणामों को प्रासंगिकता के अनुसार क्रमबद्ध "dddwordddd", "word", "wordddd" और "dddword" प्रदर्शित करना चाहिए।
- यदि मैं एक खोज क्वेरी में कई शब्द लिख रहा हूं, तो परिणाम सभी शब्दों और कुछ क्वेरी दोनों से युक्त होना चाहिए। प्रासंगिकता द्वारा भी क्रमबद्ध।
- और शब्दों को समूहों में जोड़ना संभव होना चाहिए। उदाहरण के लिए, जब मैं शब्दों को उद्धरण चिह्नों में समाप्त करता हूं (या कोई अन्य आवरण, जैसे "/" या "["), तो ऐसी प्रविष्टि को शब्दों द्वारा अलग खोज के बिना सख्ती से खोजा जाना चाहिए।
मैं 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 उत्तर
तो चलिए उदाहरण टेक्स्ट के साथ एक टेबल लोड करते हैं:
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
अगर आप और जानना चाहते हैं, तो दस्तावेज़ों में क्वेरी ऑपरेटर शामिल हैं।
संबंधित सवाल
नए सवाल
sql
संरचित क्वेरी भाषा (एसक्यूएल) डेटाबेस को क्वेरी करने के लिए एक भाषा है। प्रश्नों में कोड उदाहरण, तालिका संरचना, नमूना डेटा और DBMS कार्यान्वयन के लिए एक टैग (जैसे MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2, आदि) का उपयोग किया जाना चाहिए। यदि आपका प्रश्न केवल एक विशिष्ट DBMS (विशिष्ट एक्सटेंशन / सुविधाओं का उपयोग करता है) से संबंधित है, तो इसके बजाय उस DBMS के टैग का उपयोग करें। एसक्यूएल के साथ टैग किए गए सवालों के जवाब में आईएसओ / आईईसी मानक एसक्यूएल का उपयोग करना चाहिए।