2013-12-08 59 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