我在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,如果你有多个关键字.
这可能也有效.
SELECT *
FROM myTable
WHERE CHARINDEX('mall', name) > 0
OR CHARINDEX('mall', description) > 0
Run Code Online (Sandbox Code Playgroud)