2015-09-18 41 views
1

我目前在Node JS Express和Oracle中構建一個簡單的搜索頁面。Oracle - 搜索文本 - 檢索結果的代碼片段

我想向用戶展示匹配文本的片段(第一個實例會這樣做),以便添加 SQL所發現內容的上下文。

例子:

搜索條件:'魚'

結果:亨利很喜歡去 ING,有一次他caug ...

我不是確定最好的方式來處理這個問題 - 我可以檢索整個文本塊並在Node JS中執行,但我不太喜歡將整個文本拖到應用程序中的想法,只是爲了得到一個片段。

我一直在想,REGEXP_SUBSTR可能的方式來做到這一點......但我不知道我是否可以使用正則表達式之前和匹配字後檢索x數目的字符。

我是否有正確的想法或者我是否以錯誤的方式去解決問題?

感謝

SELECT text 
    , REGEXP_SUBSTR(LOWER(text), LOWER('fish')) AS potential_snippet 
    FROM table 
WHERE LOWER(text) LIKE LOWER('%fish%'); 
+0

你確定你不想使用oracle文本進行文本搜索嗎?它也有搜索文本的標記。在你的例子中,你只需要將關鍵字作爲potential_snippet存在,並將它置於空白處。 – Nagh

+0

謝謝納。我已經考慮過使用Oracle文本 - 但是需要在每個「INSERT」上重建索引的事實都與我有關。我一直在玩'CONTEXT'索引,在'CONTAINS'搜索上執行時間是6+秒,而搜索相同的東西只用了1秒鐘(使用LIKE)(對於相同的搜索詞) 。 – doublesidedstickytape

+0

我也不確定REGEX模式是什麼 - 我正在嘗試'/魚(?<=魚)(?!* *魚)。{15} /'但它不是很正確,還你說)返回NULL - 這就是爲什麼我不確定如果REGEX_SUSBTR是做到這一點的好方法(我是否只是不知道如何給我們,或者如果我完全錯了我的方法) – doublesidedstickytape

回答

1

試試這個:

select text 
    , SUBSTR(TEXT, INSTR(LOWER(TEXT),'fish', 1)-50,100) 
    FROM test 
WHERE INSTR(LOWER(text),'fish', 1)<>0; 

播放與位置和長度的數字(在我的例子50和100),以限制字符串的長度。

+0

謝謝Cristian_I--對我來說幾乎是適用的 - 需要隨時隨地說說你的位置和長度,因爲任何以「魚」開頭的東西都不會被拾起 - 也許「CASE」聲明可以解決這個問題? – doublesidedstickytape

+0

我認爲這已經對它排序 - 'SUBSTR(下(文本),案例當INSTR(LOWER(文本),'%fish%',1)= 0 THEN 0 ELSE -50 END,100)作爲片段' – doublesidedstickytape

+0

我編輯了代碼。我認爲這是比使用'CASE'更優雅的方法 –

1

如果你需要提取一些情況下使用JavaScript的幫助下,你可以使用正則表達式限制量詞:

/\b.{0,15}fish.{0,15}\b/i 

demo

這裏,

  • \b - 比賽在單詞邊界處(以便上下文僅包含整個單詞)
  • .{0,15} - 除換行符以外的任何字符([\s\S][^]更換,如果你需要包括新行)
  • fish - 關鍵字

/i修正啓用不區分大小寫的搜索。

如果你需要一個動態的正則表達式的創造,使用構造函數符號:

RegExp("\\b.{0,15}" + keyword + ".{0,15}\\b", "i"); 

另外,如果你需要找到多個匹配,使用g修改旁邊的i

+0

謝謝stribizhev您的回答 - 非常全面和清晰。我仍然不確定是要解決這個SQL方面,還是不是 - 這當然是一個解決方案,但是,再次感謝您。 – doublesidedstickytape

+2

請花些時間,只接受最適合您的解決方案。 –