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

Dam*_*ian 8 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
Run Code Online (Sandbox Code Playgroud)

使用关键字"书写"的搜索应该返回魔术标记和XPigment Liner

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

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

SELECT DISTINCT FROM mytable WHERE name IN ('pall mall cigarettes')
Run Code Online (Sandbox Code Playgroud)

SELECT DISTINCT FROM mytable WHERE name IN ('mall')
Run Code Online (Sandbox Code Playgroud)

将返回0行

我无法弄清楚如何使查询适应名称和描述列,并允许部分单词匹配..

有人可以帮忙吗?

更新:

我通过hibernate创建了表,并且对于description字段,使用了javax.persistence @Lob annotation.Using psql,当我检查表时,它显示了

...
 id           | bigint                      | not null
 description  | text                        |  
 name         | character varying(255)      | 
...
Run Code Online (Sandbox Code Playgroud)

表中的一条记录是,

id | description | name 
21 | 133414      | magic marker
Run Code Online (Sandbox Code Playgroud)

str*_*cer 23

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

如果您的数据不大,您可以这样做

SELECT DISTINCT(name) FROM mytable WHERE name LIKE '%mall%' OR description LIKE '%mall%'
Run Code Online (Sandbox Code Playgroud)

使用OR,如果你有多个关键字.

  • 您也应该了解区分大小写. (2认同)

Nar*_*ian 5

这可能也有效.

SELECT * 
FROM myTable
WHERE CHARINDEX('mall', name) > 0
  OR CHARINDEX('mall', description) > 0
Run Code Online (Sandbox Code Playgroud)