J'ai un ensemble d'éléments dans db .Chaque item
a un name and a description
. J'ai besoin d'implémenter une fonction search
qui prend un certain nombre de mots clés et renvoie des éléments distincts qui ont au moins un des mots clés correspondant à un mot dans le nom or
description.
par exemple, j'ai dans la base de données, trois éléments
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
Une recherche utilisant le mot-clé "écriture" devrait retourner un marqueur magique et un XPigment Liner
Une recherche utilisant le mot clé 'mall' devrait renvoyer le deuxième élément
J'ai essayé d'utiliser le mot clé LIKE
et le mot clé IN
séparément, .. Pour que le mot clé IN
fonctionne, la requête doit être
SELECT DISTINCT FROM mytable WHERE name IN ('pall mall cigarettes')
mais
SELECT DISTINCT FROM mytable WHERE name IN ('mall')
renverra 0 lignes
Je ne pouvais pas comprendre comment faire une requête qui accepte à la fois les colonnes de nom et de description et permet une correspondance partielle avec Word.
Quelqu'un peut-il aider?
mise à jour:
J'ai créé la table via hibernate et pour le champ de description, j'ai utilisé javax.persistence @Lob annotation.Using psql lorsque j'ai examiné la table, elle s'affiche
...
id | bigint | not null
description | text |
name | character varying(255) |
...
L'un des enregistrements du tableau est comme,
id | description | name
21 | 133414 | magic marker
Tout d'abord, cette approche ne sera pas mise à l'échelle dans le grand, vous aurez besoin d'un index séparé des mots à l'élément (comme un index inversé).
Si vos données ne sont pas volumineuses, vous pouvez le faire
SELECT DISTINCT(name) FROM mytable WHERE name LIKE '%mall%' OR description LIKE '%mall%'
en utilisant OR
si vous avez plusieurs mots clés.
Cela peut également fonctionner.
SELECT *
FROM myTable
WHERE CHARINDEX('mall', name) > 0
OR CHARINDEX('mall', description) > 0