【问题标题】:Searching for any word or part of it inside string在字符串中搜索任何单词或其中的一部分
【发布时间】:2015-05-03 18:47:50
【问题描述】:

我一直在尝试实现搜索查询,其中一部分是搜索字符串。我想要完成的是从 "lorem ipsum dolor es" 的示例字符串中搜索任何单词。 em>lorem OR lorem ipsum OR dolor OR *lorem ipsum dolor em> es* 如果适用。

到目前为止我尝试了什么:

类似于 '%lorem ipsum dolor es%' - 这显然返回 0,因为没有找到整个字符串

LIKE LOWER '%lorem ipsum dolor es%' - 同上

to_tsvector(files.desc) @@ 'lorem ipsum dolor es' - 结果也为空

我是否必须将用户输入转换为单词数组才能完成我的任务?

编辑:

我最初的想法是能够在我的表中找到字符串的任何部分,这通过使用以下查询来解决。然而,我遇到了另一个障碍。如果我想通过使用一个查询并严格搜索来搜索两个表怎么办。如果用户键入“lorem ipsum keyword4”,我希望它找到任何具有包含 lorem ipsum 的任何单词的描述并且具有属于它的关键字 4 的图像。但我也希望它能够找到图像,如果一个类型“keyword4”或类型“lorem ipsum”。下面的小提琴显示了在一种类型“lorem ipsum keyword4”的情况下它是如何工作的。我该怎么做?

fiddle here

【问题讨论】:

  • 你的问题没有意义。如果字符串包含lorem ipsum dolor es,则其余条件只是噪音。请澄清。
  • 就像在字符串中搜索任何单词一样简单。如果用户输入“lorem ipsum dolor es”,我希望能够检查它的任何单词是否存在于我的表中,不一定是整个字符串,@Nuri Tasdermir 回答正确
  • 所以你的问题应该说 OR 现在它说 AND ,这仍然不清楚,因为你列出任意组合。但是,接受的答案仅找到 所有 个单词包含在同一字符串中的匹配项,而不仅仅是 any 的这些话 - 既不符合您的问题也不您的评论。请用 exact 定义澄清您的问题。还要说明搜索是否应区分大小写。

标签: postgresql search sql-like


【解决方案1】:

我使用了一个搜索功能。其中 p_name 是作为“lorem ipsum dolor es”的文本输入。它查找名称包含所有单词作为子字符串的患者记录。

SELECT * FROM patient    
WHERE patient.name LIKE ALL (SELECT DISTINCT '%' || name || '%' FROM UNNEST(STRING_TO_ARRAY(p_name,' ')) AS name)

【讨论】:

    【解决方案2】:

    查找所有包含任何 单词的字符串的最快和最简单的方法 - 在Postgres text search中被视为英语(默认字典)中的自然语言单词:

    SELECT * FROM tbl
    WHERE  to_tsvector(string)
       @@  to_tsquery(replace('lorem ipsum dolor es'::text, ' ', '|'));
    

    SQL Fiddle.

    文本搜索不区分大小写。
    索引可以非常有效地支持这一点。

    【讨论】:

      猜你喜欢
      • 2011-08-10
      • 1970-01-01
      • 2017-01-09
      • 2018-01-08
      • 1970-01-01
      • 2016-11-25
      • 2011-12-27
      • 1970-01-01
      相关资源
      最近更新 更多