2016-06-17 43 views
1

在文本搜索中將通配符與點組合使用時,我的查詢找不到匹配的行。使用通配符進行查詢並且點與Oracle文本索引不匹配

例如:

CREATE TABLE MY_TABLE(ITEM_NUMBER VARCHAR2(50 BYTE) NOT NULL); 
INSERT INTO MY_TABLE (ITEM_NUMBER) VALUES ('1234.1234'); 
create index TIX_ITEMNO on MY_TABLE(ITEM_NUMBER) indextype is ctxsys.context; 

我想找到的行中MY_TABLE其中ITEM_NUMBER欄是 '1234.1234'

這確實發現該行:

SELECT * FROM MY_TABLE 
WHERE CONTAINS(ITEM_NUMBER, '%1234') > 0 

這沒有找到該行:

SELECT * FROM MY_TABLE 
WHERE CONTAINS(ITEM_NUMBER, '%.1234') > 0 

我不明白爲什麼,因爲根據甲骨文的點不是一個特殊的角色必須逃脫。

我該如何處理這種情況?

+0

什麼數據與第一個匹配而不是第二個匹配? – Nivas

+1

請顯示您的示例輸入數據運行查詢和預期結果。 – OldProgrammer

+0

您沒有以「.1234」結尾的「text」值。 –

回答

3

這是因爲默認的詞法分析器是治療期間作爲一個單詞分隔符。

初始設置:

create table my_table(item_number varchar2(50 byte) not null); 

insert into my_table values ('1234.1234'); 

create index my_index on my_table (item_number) 
indextype is ctxsys.context; 

這可以讓你看到的行爲:

SELECT * FROM MY_TABLE 
WHERE CONTAINS(ITEM_NUMBER, '%1234') > 0; 

-------------------------------------------------- 
1234.1234 

SELECT * FROM MY_TABLE 
WHERE CONTAINS(ITEM_NUMBER, '%.1234') > 0; 

no rows selected 

如果添加一個詞法分析器定義PRINTJOINS包括期限:

drop index my_index; 

begin 
    ctx_ddl.create_preference('my_lexer', 'BASIC_LEXER'); 
    ctx_ddl.set_attribute('my_lexer', 'PRINTJOINS', '.'); 
end; 
/

create index my_index on my_table (item_number) 
indextype is ctxsys.context 
parameters ('lexer my_lexer'); 

則以您想要的方式行事:

SELECT * FROM MY_TABLE 
WHERE CONTAINS(ITEM_NUMBER, '%.1234') > 0; 

ITEM_NUMBER 
-------------------------------------------------- 
1234.1234 

Read more about text indexing elements

+0

超級解釋。 :) –

0

我想你想

SELECT * FROM MY_TABLE 
WHERE ITEM_NUMBER like '%.1234' 
+0

是的。它適用於LIKE,但我想知道它爲什麼不適用於CONTAINS。 – Palmi

相關問題