【发布时间】: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