2015-09-04 60 views
1

我有一個的Oracle SQL查詢,如下:查詢重寫模板中的Oracle SQL

select id from docs where CONTAINS (text, 
'<query> 
    <textquery lang="ENGLISH" grammar="CONTEXT"> Informix 
    <progression> 
     <seq><rewrite>transform((TOKENS, "{", "}", "AND"))</rewrite></seq> 
    </progression> 
    </textquery> 
</query>')>0; 

查詢按預期工作。但我想搜索單詞Inform/Infor/Info。所以我改變了以下查詢:

select id from docs where CONTAINS (text, 
'<query> 
    <textquery lang="ENGLISH" grammar="CONTEXT"> Informix 
    <progression> 
     <seq><rewrite>transform((TOKENS, "?{", "}", "AND"))</rewrite></seq> 
    </progression> 
    </textquery> 
</query>')>0; 

通過添加額外的「?」在轉換功能。但是這會查找informix/informi/inform/infor/info/inf/in。我想限制搜索到特定的字符4.說直到info。怎樣才能實現?

謝謝。

+0

您搜索的字符串是informix首先,然後kukui堅果? – SriniV

+0

對不起錯別字 –

回答

1

要查找包含的任何Informix和信息之間的條件中的至少一個出現的所有文檔使用OR運算符 並列出所有你allowerd條款在模板

<query> 
    <textquery lang="ENGLISH" grammar="CONTEXT"> informix informi inform infor info 
     <progression> 
     <seq><rewrite>transform((TOKENS, "{", "}", "OR"))</rewrite></seq> 
     </progression> 
    </textquery> 
</query> 

但是模板的用法不是真的在這裏意味深長。 你直接查詢

select score(1), id from docs 
where contains(text,'informix OR informi OR inform OR infor OR info',1) > 0 
order by 1 desc; 

這種情況下的優點得到了相同的結果是,你可以用更長的字符串具有較高weights

select score(1), id from docs 
where contains(text,'informix*5 OR informi*4 OR inform*3 OR infor*2 OR info',1) > 0 
order by 1 desc; 

者均基於prefering文件CONTROLL比分? (fuzzy)運算符用於IMO查找拼寫錯誤的單詞,而不是術語的確切前綴。

UPDATE

前綴的級聯你可以在裝配PL/SQL或者如果需要以SQL如如下:

with txt as (  
select 'informix' text from dual), 
txt2 as (
select 
    substr(text,1,length(text) -rownum+1) text 
from txt connect by level <= length(text) -3 
) 
select 
    LISTAGG(text, ', ') WITHIN GROUP (ORDER BY text desc) 
from txt2 

informix, informi, inform, infor, info 
+0

感謝Marmite的解釋。 –

+0

我的輸入是「informix」。我如何動態地將這些數據幀設置爲「informix informi informfor info info」。輸入可以是任何字符串。 –