2011-10-13 9 views
6

अगर मैं निम्नलिखित'% abc%' खोज के लिए टेक्स्ट इंडेक्स कैसे बनाएं?

create table t 
(
    data varchar(100) 
); 

मैं कुशलता से निम्न करने के लिए सक्षम होने के लिए एक सूचकांक बनाना चाहते हैं की तरह एक मेज है मैं की तरह x like '%abc%'

सूचकांक प्रश्नों करना चाहते हैं:

select * from t where contains('%abc%'); 

और यह:

select * from t where contains('abc%'); 

मैं यह भी चाहते हैं कि इस तालिका को लाइव अपडेट किया जाए।

मैं ऐसी अनुक्रमणिका कैसे बना सकता हूं? (मुझे लगता है मैं एक ctxcat सूचकांक की जरूरत है, लेकिन मैं क्या विकल्प मैं इसे देने की आवश्यकता के बारे में उलझन हूँ)

मैं Oracle 10g उपयोग कर रहा हूँ।

उत्तर

7

मैं का प्रयोग करेंगे इस

BEGIN 
    ctx_ddl.create_preference ('FT_WL', 'BASIC_WORDLIST'); 
    ctx_ddl.set_attribute  ('FT_WL', 'substring_index', 'YES'); 
    ctx_ddl.set_attribute  ('FT_WL', 'prefix_index',  'YES'); 
    ctx_ddl.set_attribute  ('FT_WL', 'prefix_min_length', 1); 
    ctx_ddl.set_attribute  ('FT_WL', 'prefix_max_length', 6); 
    END; 

CREATE INDEX fulltext_idx ON tmp_fulltext (fulltext) 
INDEXTYPE IS CTXSYS.CTXCAT 
PARAMETERS ('WORDLIST FT_WL') 

पैरामीटर यहां समझाए गए हैं Oracle Text Reference

(आप न्यूनतम और अधिकतम लंबाई मूल्यों उचित करने के लिए सेट)

और इस सवाल को देखें कि रीफ्रेश का प्रबंधन कैसे करें और कैसे उच्च कार्डिनालिटी डेटा के साथ पूर्ण स्कैन से सूचकांक तेज नहीं हो सकता है:

PL/SQL Performance Tuning for LIKE '%...%' Wildcard Queries

+1

उत्तर के लिए धन्यवाद। बस कुछ प्रश्न: 'abc%' प्रश्नों के लिए 'prefix_index' और'% abc% 'क्वेरी के लिए 'substring_index' है? और सभी सबस्ट्रिंग्स डिफ़ॉल्ट सूचकांक द्वारा सबस्ट्रिंग सूचकांक करता है? इसके अलावा, मैं इस सूचकांक का उपयोग कैसे करूं? क्या होगा (कॉल, '% abc%') 'और' शामिल है (col, 'abc%') 'चाल करें? – Clinton

+0

हां उन खोजों का काम होगा, एक लिंक के साथ अद्यतन किया गया है जो इसे मुझसे बेहतर समझा सकता है, लेकिन अनिवार्य रूप से पैरामीटर का उपयोग उस प्रकार की खोज के प्रदर्शन को बेहतर बनाने के लिए किया जाता है। –

0

आपकी समस्या को देखते हुए अगर अपने डेटाबेस तो बड़ा आप Sphinx Search

स्फिंक्स का उपयोग कर सकते है एक खुला स्रोत पूर्ण पाठ खोज सर्वर, जमीन प्रदर्शन, प्रासंगिकता के साथ से डिज़ाइन किया गया है (उर्फ गुणवत्ता खोज), और एकीकरण सादगी दिमाग में। यह सी ++ में लिखा गया है और लिनक्स (रेडहाट, उबंटू, इत्यादि), विंडोज, मैकोज़, सोलारिस, फ्रीबीएसडी, और कुछ अन्य सिस्टम

+0

यह दिलचस्प लग रहा है, लेकिन दुर्भाग्य से मैं Oracle 10g के साथ अटक कर रहा हूँ। – Clinton

+0

मुझे इसके उपवास पर विश्वास करें और आप अपडेट इंडेक्स भी जी सकते हैं .... – Wazzzy

0

पर काम करता है आप ओरेकल में केवल तभी कर सकते हैं यदि आपके पास इंटरमीडिया/ओरेकल टेक्स्ट विकल्प है सर्वर ...

अपने उदाहरण के लिए आप इस्तेमाल कर सकते हैं

create index t_index_data on t(data) 
indextype is ctxsys.context 
parameters ('DATASTORE CTXSYS.DEFAULT_DATASTORE'); 

मुझे यकीन है कि नहीं कर रहा हूँ अगर आप varchar2(100) से clob के प्रकार बदलने के लिए की जरूरत है।

विवरण और विकल्पों/उदाहरण अनुक्रमित की इस तरह के बारे में के लिए देखें http://download.oracle.com/docs/cd/A91202_01/901_doc/text.901/a90122/ind4.htm

+0

क्या आप वाकई इस इंडेक्स सबस्ट्रिंग्स को सुनिश्चित करते हैं? मैंने दस्तावेज़ पढ़ा, और ऐसा लगता है कि मुझे "वरीयता" "SUBSTRING_INDEX" या कुछ चाहिए। क्या आप एक कोड उदाहरण दे सकते हैं जो मैं घट रहा हूं जिसमें सबस्ट्रिंग इंडेक्स शामिल है? – Clinton

+0

आप वरीयता के बारे में सही हो सकते हैं - मेरे पास उन विकल्पों के साथ ओरेकल सर्वर नहीं है, इसलिए मैं इसका परीक्षण नहीं कर सकता ... – Yahia

1

हां आपको डोमेन इंडेक्स बनाने से पहले पर्यावरण बनाने की आवश्यकता है। इसे बनाने के लिए आपको ctxsys उपयोगकर्ता और आवश्यक ctxapp previliges होना चाहिए। अपने पर्यावरण के लिए एक के लिए नीचे दिए गए लिंक में बताए गए चरणों का पालन करें। यह उपयोगकर्ता ऑरैकल इंस्टॉल करते समय डिफ़ॉल्ट रूप से नहीं बनाया गया है।

http://www.oraclebin.com/2012/12/creating-environment-for-ctxsys.html

बार जब आप सभी अनुदान और संकुल आप वरीयताओं बना सकते हैं और सूचकांक दिखाया गया है की है।

SQL> begin 
    2 ctx_ddl.create_preference('SUBSTRING_PREF', 'BASIC_WORDLIST'); 
    3 ctx_ddl.set_attribute('SUBSTRING_PREF', 'SUBSTRING_INDEX','TRUE'); 
    4 end; 
    5/

अब दिखाए गए अनुसार एक डोमेन इंडेक्स बनाएं।

SQL> create index test_idx on test(object_name) 
    2 indextype is ctxsys.context parameters ('wordlist SUBSTRING_PREF MEMORY 50M'); 

Index created. 

select * from test where contains(object_name,'%EXEC%') > 0; 

नीचे दिए गए लिंक को देखें जो निष्पादन योजना के साथ इसे समझाता है।

संदर्भ: http://www.oraclebin.com/2012/12/oracle-text-and-domain-indexes.html

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