【问题标题】:Full Text search using oracle regex使用 oracle 正则表达式进行全文搜索
【发布时间】:2015-01-22 15:55:46
【问题描述】:

我正在尝试在oracle 11g中使用regexp_like()来实现文本搜索。

例如,我有一个名为 posts 的表,如果我有值,则在标题列中

'How to create a new post with pictures and videos'
'How to create a new post enter code here'

如果我写一个查询

select * from posts where regexp_like(title, '.*pictures.*|.*how.*|.*post.*', 'i')

它返回具有两个标题的记录,其中第二个值没有单词图片。我知道它是因为我用户'|'在表达式中。

我想要实现的是它应该返回记录只有当所有单词都以任何顺序出现在列中时。请帮助我使用正则表达式

【问题讨论】:

  • 您尝试使用单个 regexp_like,而不是每个搜索词一个?
  • 是的。我想用一个表达式来做。
  • " 我想用一个表达式来做。" 你不能。除非通过生成包含所有单词组合的正则表达式 - 或者通过某种方式对正则表达式和列数据中的单词进行排序。对于可以通过使用AND 加入多个子句来解决的问题,两者似乎都过于复杂。如果您对此确实有严格的限制,则应查看其他评论中建议的 Oracle 文本。

标签: sql regex oracle oracle11g full-text-search


【解决方案1】:

希望这会对你有所帮助。

我在 AngularJS 中写了一个 plunker。只是为了演示正则表达式的工作原理。

http://plnkr.co/edit/6WrCCAfNwidVxKkRFH9l?p=preview

你可以使用的正则表达式是

/^(?=.(图片))(?=.(帖子))(?=.*(how))[a-zA-Z]{1,100}$/

这意味着图片,帖子,在给定段落中应该如何出现。 您可以根据需要调整段落的长度。

<form role="form" name="myform">
<div>
    <div class="col-sm-8">
        <input type="text" ng-model="user" name="inputfield" required="true"  ng-pattern="/^(?=.*(pictures))(?=.*(post))(?=.*(how))[a-zA-Z ]{1,100}$/">
        <span ng-show="myform.inputfield.$dirty && !myform.inputfield.$error.required && myform.inputfield.$error.pattern">
          <small class="text-danger">
          Not Matching
        </small>
       </span>

    </div>
  </div>
</form>

【讨论】:

  • 这在您的演示中区分大小写,但更重要的是 - 不幸的是 - 仅限 Oracle supports a limited subset or regex,主要是带有一些 Perl 扩展的 POSIX。
  • 要删除区分大小写,你可以使用 reg exp as --> "/^(?=.*(pictures|PICTURES))(?=.*(post|POST))(?= .*(how|HOW))[a-zA-Z]{1,100}$"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-18
  • 1970-01-01
  • 1970-01-01
  • 2016-07-19
  • 2014-10-21
  • 2015-09-22
  • 2020-10-04
相关资源
最近更新 更多