web-dev-qa-db-fra.com

Comment créer une requête SQL pour rechercher des correspondances partielles?

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
9
Damon Julian

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.

23
stracktracer

Cela peut également fonctionner.

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