Como faço para criar a pesquisa sql para procurar correspondências parciais?
item
tem um name and a description
.Eu preciso implementar uma instalação search
que pega um número de palavras-chave e retorna itens distintos que têm pelo menos uma das palavras-chave que correspondem a uma palavra no nome or
descrição.
por exemplo Eu tenho no db ,três itens
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
uma pesquisa com a palavra-chave 'writing' deverá devolver o marcador mágico e o invólucro do XPigment
uma pesquisa com a palavra-chave 'mall' deverá devolver o segundo item
tentou usar a palavra-chave LIKE
e a palavra-chave IN
separadamente..
Para IN
palavra-chave para funcionar, a consulta tem de ser
SELECT DISTINCT FROM mytable WHERE name IN ('pall mall cigarettes')
Mas
SELECT DISTINCT FROM mytable WHERE name IN ('mall')
irá devolver 0 linhas
Eu não consegui descobrir como fazer uma consulta que acomoda tanto o nome como as colunas de descrição e permite correspondência parcial de palavras..
Alguém pode ajudar?actualizar:
criei a tabela através do hibernado e para o campo Descrição, usei o javax.persistência @Lob anotacao.Usando psql quando examinei a tabela, é mostrado
...
id | bigint | not null
description | text |
name | character varying(255) |
...
Um dos registos da tabela é:
id | description | name
21 | 133414 | magic marker
2 answers
Em primeiro lugar, esta abordagem não vai escalar no grande, você vai precisar de um índice separado de palavras para item (como um índice invertido).
Se os seus dados não forem grandes, pode fazer
SELECT DISTINCT(name) FROM mytable WHERE name LIKE '%mall%' OR description LIKE '%mall%'
Utilizar OR
se tiver várias palavras-chave.
SELECT *
FROM myTable
WHERE CHARINDEX('mall', name) > 0
OR CHARINDEX('mall', description) > 0