【问题标题】:How do I create sql query for searching partial matches?如何创建用于搜索部分匹配的 sql 查询?
【发布时间】:2011-11-02 15:07:18
【问题描述】:

我在 db 中有一组项目。每个 item 都有一个 name and a description。我需要实现一个 search 设施,它接受许多关键字并返回至少有一个关键字匹配的不同项目名称中的一个词or 描述。

例如 我在数据库中,三个项目

1.item1 : 
    name : magic marker
    description: a writing device which makes erasable marks    on whiteboard

2.item2:
    name: pall mall cigarettes
    description: cigarette named after a street in london

3.item3:
    name: XPigment Liner
    description: for writing and drawing

使用关键字“写作”的搜索应返回魔术标记和 XPigment Liner

使用关键字“mall”进行搜索应返回第二项

我尝试分别使用LIKE 关键字和IN 关键字,.. 要使IN 关键字起作用,查询必须是

SELECT DISTINCT FROM mytable WHERE name IN ('pall mall cigarettes')

但是

SELECT DISTINCT FROM mytable WHERE name IN ('mall')

将返回 0 行

我不知道如何进行同时容纳名称和描述列并允许部分单词匹配的查询..

有人可以帮忙吗?

更新:

我通过hibernate创建了表,对于描述字段,使用了javax.persistence @Lob注解。当我检查表时使用psql,它显示了

...
 id           | bigint                      | not null
 description  | text                        |  
 name         | character varying(255)      | 
...

表中的一条记录是这样的,

id | description | name 
21 | 133414      | magic marker

【问题讨论】:

  • 您需要使用 LIKE 而不是 IN。 IN 用于从集合中找出值。 LIKE 应该用于部分字符串比较。
  • 首先,你需要弄清楚文字描述存储在哪个表中。
  • 有什么办法可以找出来吗?我正在使用 postgres.. 使用 /d 命令找不到太多内容

标签: sql keyword


【解决方案1】:

首先,这种方法不会大规模扩展,您需要一个从单词到项目的单独索引(如倒排索引)。

如果你的数据不大,可以做

SELECT DISTINCT(name) FROM mytable WHERE name LIKE '%mall%' OR description LIKE '%mall%'

如果您有多个关键字,请使用 OR

【讨论】:

  • 你需要select distinct name from...
  • 您也应该注意区分大小写。
  • 在数据库中,我将描述存储为 javax.persistence.Lob 类型..所以,db(postgres) 表有一个数字(133414 等)作为字段内容..'描述LIKE '%something%' 无法返回匹配项。知道如何处理吗?
【解决方案2】:

这也可以。

SELECT * 
FROM myTable
WHERE CHARINDEX('mall', name) > 0
  OR CHARINDEX('mall', description) > 0

【讨论】:

    猜你喜欢
    • 2020-11-09
    • 2013-12-10
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 2023-02-10
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    相关资源
    最近更新 更多