2011-07-10 5 views
7

निम्न उदाहरणएच 2 डाटाबेस में पूर्ण-पाठ खोज का उपयोग कैसे करें?

CREATE ALIAS IF NOT EXISTS FT_INIT FOR "org.h2.fulltext.FullText.init"; 
CALL FT_INIT(); 
DROP TABLE IF EXISTS TEST; 
CREATE TABLE TEST(ID INT PRIMARY KEY, NAME VARCHAR); 
INSERT INTO TEST VALUES(1, 'Hello World'); 
CALL FT_CREATE_INDEX('PUBLIC', 'TEST', NULL); 

पर विचार करें और मैं निम्न क्वेरी

SELECT * FROM FT_SEARCH('Hello', 0, 0); 

मार डाला है लेकिन इस क्वेरी लौटने "सार्वजनिक"। "टेस्ट" कहां "आईडी" = 1

  1. क्या मुझे फिर से 'हैलो' शब्द वाले रिकॉर्ड प्राप्त करने के लिए यह "PUBLIC"."TEST" WHERE "ID"=1 निष्पादित करना है?
  2. FT_Search से 'ell' शब्द के साथ सभी रिकॉर्ड्स खोजने के लिए क्वेरी क्या है। में एच 2 मूल निवासी पूर्ण पाठ खोजें

उत्तर

8
  1. हाँ, एक प्रश्न FT_SEARCH का उपयोग करने में प्रत्येक पंक्ति एक स्कीमा-तालिका पंक्ति जहां प्रमुख शब्दों में से एक मिला था का प्रतिनिधित्व करता है% ell% की तरह के रूप में ऐसी। खोज केस असंवेदनशील है, और पैरामीटर FT_SEARCH में एक से अधिक शब्द शामिल हो सकते हैं। उदाहरण के लिए,

    DELETE FROM TEST; 
    INSERT INTO TEST VALUES(1, 'Hello World'); 
    INSERT INTO TEST VALUES(2, 'Goodbye World'); 
    INSERT INTO TEST VALUES(3, 'Hello Goodbye'); 
    CALL FT_REINDEX(); 
    SELECT * FROM FT_SEARCH('hello goodbye', 0, 0); 
    

    रिटर्न केवल तीन पंक्ति:

    QUERY       SCORE 
    "PUBLIC"."TEST" WHERE "ID"=3 1.0 
    

    भी ध्यान रखें कि FT_SEARCH_DATA डेटा अपने आप को पुनः प्राप्त करने के लिए इस्तेमाल किया जा सकता है। उदाहरण के लिए,

    SELECT T.* FROM FT_SEARCH_DATA('hello', 0, 0) FT, TEST T 
    WHERE FT.TABLE='TEST' AND T.ID=FT.KEYS[0]; 
    

    रिटर्न दोनों पंक्तियों कीवर्ड युक्त:

    ID NAME 
    1 Hello World 
    3 Hello Goodbye 
    
  2. Apache Lucenewildcard खोज करता है, हालांकि प्रमुख वाइल्डकार्ड का समर्थन करता है (उदाहरण के लिए * ell) महंगे होते हैं।

+0

यह वही है जो मैं चाहता हूं। धन्यवाद। – Vivek

+0

फिर से मुझे बताए गए ल्यूसीन के साथ एच 2 डेटाबेस को इंडेक्स करने का कोई तरीका है। – Vivek

+0

[ल्यूसीन फुलटेक्स्ट सर्च का उपयोग करना] (http://www.h2database.com/html/tutorial.html#fulltext) बहुत समान है, आपको बस अपने क्लासपाथ में लुसीन libs की आवश्यकता है। – trashgod

3

मैं फिर से इस "सार्वजनिक" निष्पादित करने के लिए है। "टेस्ट" कहाँ "आईडी" = 1 युक्त 'हैलो' शब्द रिकॉर्ड प्राप्त करने के लिए?

हां, सिवाय इसके कि यदि आप ट्रैशगोड द्वारा वर्णित एक संयोजन का उपयोग करते हैं। कारण यह है कि आम तौर पर पंक्तियां केवल दो शब्दों की तुलना में बहुत बड़ी होती हैं। उदाहरण के लिए, एक पंक्ति में एक दस्तावेज़ के साथ एक सीएलओबी होता है। अगर पूर्ण टेक्स्ट खोज के परिणाम में डेटा होगा, तो पूर्ण टेक्स्ट खोज बहुत धीमी होगी।

FT_Search से 'ell' शब्द के साथ सभी रिकॉर्ड्स खोजने के लिए क्वेरी क्या है। जैसे H2 मूल पूर्ण-पाठ खोज

मूल पूर्ण टेक्स्ट खोज सीधे ऐसा नहीं कर सकता है। कारण यह है कि: पूर्ण टेक्स्ट खोज केवल पूरे शब्दों को अनुक्रमणित करता है। (वैसे: क्या Google खोजों का समर्थन करता है यदि आप केवल एक शब्द का हिस्सा जानते हैं? अपाचे ल्यूसीन इसका समर्थन करता है) वास्तव में, एच 2 के लिए, एक तरीका होगा: सबसे पहले, मिलान के लिए शब्द तालिका (FT.WORDS) खोजें, और फिर नियमित खोज का उपयोग करें।

+0

हां, लुसीन [वाइल्डकार्ड] का समर्थन करता है (http://wiki.apache.org/lucene-java/LuceneFAQ#What_wildcard_search_support_is_available_from_Lucene.3F); मैंने अपने जवाब में (पहले) टूटा लिंक तय किया। आंशिक मिलान के लिए 'FT.WORDS' खोजने पर अच्छा विचार। – trashgod

+0

दरअसल, क्योंकि नियमित पूर्ण पाठ खोज खोज शब्दों को जोड़ती है और केवल एक क्वेरी में FT.WORDS के परिणामों की तलाश नहीं कर सकती है। मान लीजिए कि आप 'एबी%' खोजना चाहते हैं, एक एफटी। डब्ल्यूडब्ल्यूएस क्वेरी शब्द उम्मीदवारों के रूप में 'एबीसीडीई' और 'एबीएक्सवाईजेड' वापस कर सकती है। अब 'एबीसीडीई एबीएक्सवाईड' के लिए नियमित रूप से पूर्ण पाठ खोज छेड़छाड़ वापस कर देगी, संभवतः खाली सेट की संभावना है। FT.WORDS दृष्टिकोण का उपयोग करने के लिए, आपको पहले अपने 'एबी%' शब्द का विस्तार करना होगा और फिर प्रत्येक विस्तार के लिए पूर्ण पाठ खोज को कॉल करना होगा। और यदि आपके पास एकाधिक खोज शब्द हैं, तो आपको * सभी संयोजन * खोजना होगा। – hendrik