2013-12-08 100 views
1

我想在給定字符串的數據庫列中找到最接近的匹配字符串。搜索後,我來到了下面的表格和查詢與Oracle文本搜索最接近的匹配,包括短字符串

CREATE TABLE docs (id NUMBER PRIMARY KEY, text VARCHAR2(200)); 
INSERT INTO docs VALUES(1, 'California is a state in the US.'); 
INSERT INTO docs VALUES(2, 'Paris is a city in France.'); 
INSERT INTO docs VALUES(3, 'France is in Europe.'); 
INSERT INTO docs VALUES(4, 'Paris'); 

CREATE INDEX idx_docs ON docs(text) 
    INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS 
    ('DATASTORE CTXSYS.DEFAULT_DATASTORE'); 

SELECT SCORE(1), id, text 
    FROM docs 
WHERE CONTAINS(text, 'fuzzy(Parsi,1,1)', 1) > 0; 

我已經設置了相似性得分最低,即1.它適用於像「帕西」或「解析」搜索字符串用。它給了我想要的結果。但是,如果搜索字符串像「par」或「pa」那樣太小,它不會顯示任何結果。

即使使用非常短的字符串進行搜索,我該如何才能獲得最接近的匹配?

回答

1

你基本上創下了limit in the fuzzy operator

不像幹擴張,通過模糊 膨脹所產生的字的數量取決於什麼是在索引中。根據指數的內容,結果可能會顯着變化 。

和Oracle不index shorter strings除非您更改默認:

begin 
ctx_ddl.create_preference('mywordlist', 'BASIC_WORDLIST'); 
ctx_ddl.set_attribute('mywordlist','PREFIX_INDEX','TRUE'); 
ctx_ddl.set_attribute('mywordlist','PREFIX_MIN_LENGTH', '3'); 
ctx_ddl.set_attribute('mywordlist','PREFIX_MAX_LENGTH', '4'); 
ctx_ddl.set_attribute('mywordlist','SUBSTRING_INDEX', 'YES'); 
end; 

在這種情況下,你實際上可能使用query rewrite/relaxation模糊和通配符查詢相結合。根據我的經驗,通配符擴展往往會顯着減慢一切,儘管也許這只是正確的索引配置問題。

+0

表中的數據不是較短的字符串。它的搜索字符串很短 – AbrahamDaniel

+0

@BruceWayne重要的是索引中的內容。在你的情況下,它不包含更短的前綴。 – Tomasz