如何创建用于搜索部分匹配的sql查询?
我在数据库中有一组项。每个如何创建用于搜索部分匹配的sql查询?,sql,keyword,Sql,Keyword,我在数据库中有一组项。每个项都有一个名称和一个描述。我需要实现一个搜索功能,该功能接受许多关键字并返回不同的项,其中至少有一个关键字与名称或描述中的一个单词匹配 比如说 数据库中有三项 1.item1 : name : magic marker description: a writing device which makes erasable marks on whiteboard 2.item2: name: pall mall cigarettes
项
都有一个名称和一个描述
。我需要实现一个搜索
功能,该功能接受许多关键字并返回不同的项,其中至少有一个关键字与名称或描述中的一个单词匹配
比如说
数据库中有三项
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”的搜索应返回magic marker和XPigment Liner
使用关键字“mall”的搜索应返回第二项
我试着分别使用LIKE
关键字和IN
关键字,。。
要使
关键字中的起作用,查询必须是
SELECT DISTINCT FROM mytable WHERE name IN ('pall mall cigarettes')
但是
将返回0行
我不知道如何创建一个既包含name列又包含description列并允许部分单词匹配的查询
有人能帮忙吗
更新:
我通过hibernate创建了这个表,在description字段中使用了javax.persistence@Lob注释
...
id | bigint | not null
description | text |
name | character varying(255) |
...
表中的一条记录如下:
id | description | name
21 | 133414 | magic marker
首先,这种方法不会大规模扩展,您需要一个从单词到项目的单独索引(如反向索引)
如果您的数据不大,您可以这样做
SELECT DISTINCT(name) FROM mytable WHERE name LIKE '%mall%' OR description LIKE '%mall%'
如果您有多个关键字,请使用或。这也可以
SELECT *
FROM myTable
WHERE CHARINDEX('mall', name) > 0
OR CHARINDEX('mall', description) > 0
您需要从中选择不同的名称…
您还应该注意区分大小写。在db中,我将描述存储为javax.persistence.Lob类型。因此,db(postgres)表有一个数字(133414等)作为字段内容..“像“%something%”这样的描述无法返回匹配项..知道如何处理吗?您需要使用LIKE而不是IN。IN用于从集合中查找值。LIKE应该用于部分字符串比较。首先,您需要找出文本描述存储在哪个表中。有没有办法找到它?我使用的是postgres..使用/d命令找不到太多
SELECT *
FROM myTable
WHERE CHARINDEX('mall', name) > 0
OR CHARINDEX('mall', description) > 0