2011-08-24 5 views
4

J'ai un ensemble d'éléments dans db .Chaque item a une name and a description .Je besoin de mettre en œuvre une installation search qui prend un certain nombre de mots-clés et renvoie les éléments distincts qui ont au moins un des mots-clés correspondant à un mot au nom or Description .Comment créer une requête sql pour rechercher des correspondances partielles?

par exemple j'ai dans le db, trois articles

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 » doit retourner marqueur magique et XPigment Liner

Une recherche utilisant le mot clé « mail » devrait retourner le deuxième élément

J'ai essayé d'utiliser le mot-clé LIKE et IN mot-clé séparément, .. pour IN mot-clé 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') 

retournera 0 lignes

Je ne pouvais pas comprendre comment faire une requête qui accueille à la fois les colonnes de nom et de description et permet Troncature ..

Quelqu'un peut-il aider?

mise à jour:

J'ai créé la table par mise en veille prolongée et le champ de description, utilisé psql javax.persistence @Lob de annotation.Using quand j'examiné le tableau, il est montré

... 
id   | bigint      | not null 
description | text      | 
name   | character varying(255)  | 
... 

l'un des enregistrements de la table est comme,

id | description | name 
21 | 133414  | magic marker 
+0

Vous devez utiliser LIKE plutôt qu'IN. IN est utilisé pour trouver des valeurs d'un ensemble. LIKE devrait être utilisé pour les comparaisons de chaînes partielles. – Bruce

+0

Tout d'abord, vous devez comprendre dans quelle table la description textuelle est stockée. –

+0

est-il possible de trouver que? J'utilise postgres.n'a pas trouvé beaucoup en utilisant les commandes/d –

Répondre

15

tout d'abord, cette approche ne sera pas l'échelle dans la grande, vous aurez n eed un index séparé des mots à l'article (comme un index inversé).

Si vos données ne sont pas grand, vous pouvez faire

SELECT DISTINCT(name) FROM mytable WHERE name LIKE '%mall%' OR description LIKE '%mall%' 

utilisant OR si vous avez plusieurs mots-clés.

+0

Vous devez choisir un nom distinct à partir de ... ' –

+2

Vous devez également connaître la sensibilité à la casse. – Bruce

+0

Dans la base de données, je stocke la description en tant que javax.persistence.Lob type..So, la table db (postgres) a un nombre (133414 etc) comme contenu du champ..La 'description LIKE'% something% 'échoue pour retourner un match .. Une idée de comment faire face à cela? –

4

Cela peut également fonctionner.

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