Oracle – search文本 – 检索结果的片段

我目前在Node JS Express和Oracle中构build一个简单的search页面。

我想向用户显示匹配文本的片段(第一个实例会这样做),以添加SQL所find的位的上下文。

例:

search词: 'fish'

结果: 亨利真的很喜欢去钓鱼 ,一旦他注意到…

我不确定最好的方式来处理这个问题 – 我可以检索整个文本块,并在Node JS中执行,但我不太喜欢将整个文本拖到应用程序的想法,只是为了得到片段。

我一直在想, REGEXP_SUBSTR可以做到这一点…但我不确定是否可以使用正则expression式来检索匹配的单词之前和之后的x个字符。

我有没有正确的想法,还是以错误的方式去解决?

谢谢

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

尝试这个:

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

玩位置和长度数字(在我的例子中是50和100)来限制string的长度。

如果需要借助JavaScript提取一些上下文,则可以在正则expression式中使用限制量词:

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

看演示

这里,

  • \b – 匹配单词边界(以便上下文只包含整个单词)
  • .{0,15} – 除换行符以外的任何字符(如果需要包含换行符,则用[\s\S][^]replace)
  • fish – 关键字

/i修饰符启用不区分大小写的search。

如果您需要dynamic正则expression式创build,请使用构造函数表示法:

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

另外,如果您需要查找多个匹配,请在i旁边使用g修饰符。