【问题标题】:Oracle - Search for text - Retrieve snippet of resultOracle - 搜索文本 - 检索结果片段
【发布时间】:2015-09-18 10:37:09
【问题描述】:

我目前正在 Node JS Express 和 Oracle 中构建一个简单的搜索页面。

我想向用户显示匹配文本的 sn-p(第一个实例会这样做)以添加 SQL 找到的内容的 bit 上下文。

例子:

搜索词:'鱼'

结果:Henry 真的很喜欢钓鱼,一旦他钓到了……

我不确定解决此问题的最佳方法 - 我可以检索整个文本块并在 Node JS 中执行此操作,但我不太喜欢将整个文本拖到应用程序的想法,只是得到一个sn-p。

我一直在想REGEXP_SUBSTR 可以做到这一点...但我不确定是否可以使用正则表达式来检索匹配词前后的x 数量的字符。

我的想法是否正确,还是我的做法有误?

谢谢

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

【问题讨论】:

  • 您确定不想使用 oracle 文本进行文本搜索吗?它也有搜索文本的标记。在您的示例中,您只需将关键字作为 potential_sn-p 在它存在的地方获取,在不存在的地方获取空值。
  • 谢谢纳格。我考虑过使用 Oracle 文本 - 但需要在每个 INSERT 上重建索引这一事实让我很担心。我一直在玩`CONTEXT`索引,CONTAINS 搜索的执行时间是 6+ 秒,而使用 LIKE 搜索相同的东西只需要 1 多秒(对于相同的搜索词) .
  • 我也不确定 REGEX 模式是什么 - 我正在尝试 /fish(?<=fish)(?!.*fish).{15}/ 但它不太正确,而且(如你所说)返回 NULL - 这就是我为什么不确定 REGEX_SUSBTR 是否是这样做的好方法(以及我是否只是不知道如何使用它,或者我的方法是否完全错误!)
  • 如果你需要一个 JS 正则表达式来提取关键字周围的一些上下文,你可以试试/\b.{0,15}fish.{0,15}\b/i
  • @doublelateralstickytape 重建索引没什么大不了的,但是它确实需要一些处理能力和时间。因此在新添加的行可用于搜索之前会有一些延迟。因此,如果您不使用 oracle 文本,在我的实践中,在查询之外实现标记功能会更有效。 JS 可以做得更好:)

标签: regex node.js oracle search


【解决方案1】:

试试这个:

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

使用位置和长度数字(在我的示例中为 50 和 100)来限制字符串的长度。

【讨论】:

  • 谢谢 Cristian_I - 这几乎对我有用 - 需要像你说的那样调整位置和长度,因为任何以“鱼”开头的东西都不会被捡起 - 也许是 CASE语句可以解决这个问题吗?
  • 我认为这已经排序了 - SUBSTR(LOWER(text), CASE WHEN INSTR(LOWER(text), '%fish%', 1) = 0 THEN 0 ELSE -50 END, 100) AS snippet
  • 我已经编辑了代码。我认为这是一种比使用 'CASE' 更优雅的方法
【解决方案2】:

如果您需要借助 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");

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

【讨论】:

  • 感谢 stribizhev 的回答 - 非常彻底和清晰。我仍然不确定是否要解决这个 SQL 方面的问题 - 这当然是一个解决方案,再次感谢您。
  • 请慢慢来,只接受最适合您的解决方案。
猜你喜欢
  • 1970-01-01
  • 2011-03-27
  • 2018-01-15
  • 2015-09-09
  • 1970-01-01
  • 2019-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多