2013-01-09 119 views
1

我正在使用Oracle 11g和Oracle Text作爲Web搜索引擎。在Oracle中使用逗號分隔值搜索列

我現在創建了&文本索引CLOB列Keywords其中包含空格分隔的單詞。這允許我擴展搜索,因爲Oracle Text將返回存儲在該列中的具有一個或多個關鍵字的行。該列的內容對用戶是隱藏的,僅用於「擴展」搜索。這是按預期工作的。

但現在我需要支持多個單詞甚至完整的句子。使用當前配置,Oracle Text將僅搜索單個關鍵字。如何存儲短語並配置Oracle Text以便搜索整個短語(完全匹配是首選,但模糊匹配也可以)?

列兩排(分號分隔值)的內容的示例:

"hello, hello; is there anybody out there?; nope;" 
"just the; basic facts;" 

我發現了一個類似的問題:Searching a column with comma separated values,不同之處在於需要使用的Oracle 11g的溶液與它的自由文本搜索功能。

可能的解決方案:

1解決辦法:我想重新設計DB如下。我會創建一個新表Keywords(pkID NUMBER, nonUniqueID NUMBER, singlePhrase VARCHAR2(100 BYTE))。我會將前一列Keyword更改爲KeywordNonUniqueID,這將保存ID(而不是一個值列表)。在搜索時間,我會與新的Keyword表內聯合。這個解決方案的問題是我會得到多個包含除短語之外的相同數據的行。我認爲這會摧毀排名?

第二種解決方案:是否可以將短語作爲XML存儲在原始Keyword列中,並以某種方式告訴Oracle Text在XML中進行搜索?

第三種解決方案:?

請注意,通常不會有很多短語(小於100),也不會很長(單個短語最多有5個單詞)。

另請注意,我目前使用CONTAINS及其幾個操作員來滿足我的全文搜索需求。

編輯:這https://forums.oracle.com/forums/thread.jspa?messageID=10791361討論,幾乎解決了我的問題,但它也匹配單個詞,而不是整個短語(完全匹配)。

回答

1

Oracle支持默認搜索短語。 在docs我們可以看到這個

4.1.4.1 CONTAINS如果多個字包含在一個查詢表達式,僅通過 空白(無操作員)分離短語查詢

,詞語的字符串被認爲是一個 短語和Oracle Text在查詢期間搜索整個字符串。

例如,要查找包含詞組 國際法的所有文檔,請使用國際法來輸入您的查詢。

我回答你的問題還是誤解你?

P.S.在我看來,解決方案是轉換

「你好,你好;有沒有人在那裏?;不! 「只是;基本事實」;

「喂,你好AA是沒有人在那裏?AA沒了AA」 「只是AA基本 事實AA」

,並搜索包含的短語「有沒有人在那裏?」一個「

+0

這不是我喜歡的(儘管這個解決方案可能會給我足夠好的結果以滿足我的需求),因爲它還會找到包含以下短語的文檔:」international法律和法院「,因爲該文件中包含了」國際法「一詞。 我想要的是Oracle數據庫返回與短語/字符串完全匹配的文檔,或者根本沒有。 – Howie

+0

也許你可以使用帶分隔符的搜索字符串。也就是說,用「國際法」這個短語。與「國際法和法院」的文本不符。如果Oracle Text沒有在文字中包含分號,我們可以在短語結尾添加啞符號。例如,「國際法律」和「國際法與法院」的文本將有所不同。只有一個音符:你需要用啞符號檢查詞的existense。也就是說,如果我們選擇「a」作爲啞符號並搜索以「abac」爲單詞結尾的短語,我們可能會得到與單詞「abaca」錯誤匹配的結果。這是罕見的情況,但我們可以添加「aa」:) – knagaev

+0

這很瘋狂,但它可能會(_will_)工作! :) – Howie