如何创建sql查询以搜索部分匹配?

时间:2011-08-24 09:05:34

标签: sql keyword

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

例如,

我在db中有三个项目

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

使用关键字'writing'的搜索应该返回魔术标记和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创建了表,并且对于description字段,使用了javax.persistence @Lob annotation.Using psql,当我检查表时,显示了

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

表中的一条记录就像,

id | description | name 
21 | 133414      | magic marker

2 个答案:

答案 0 :(得分:23)

首先,这种方法不会在大的范围内扩展,你需要从单词到项目的单独索引(如倒排索引)。

如果您的数据不大,则可以

SELECT DISTINCT(name) FROM mytable WHERE name LIKE '%mall%' OR description LIKE '%mall%'
如果您有多个关键字,请

使用OR

答案 1 :(得分:5)

这也可以。

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