Как создать SQL-запрос для поиска частичных совпадений? - PullRequest
7 голосов
/ 24 августа 2011

У меня есть набор элементов в БД. Каждый item имеет name and a description. Мне нужно реализовать средство search, которое принимает ряд ключевых слов и возвращает отдельные элементы, которые имеют по крайней мере одно из соответствующих ключевых слов. слово в названии or описание.

например У меня в БД три предмета

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

Поиск по ключевому слову «запись» должен возвращать магический маркер и XPigment Liner

Поиск по ключевому слову mall должен вернуть второй элемент

Я пытался использовать ключевое слово LIKE и ключевое слово IN отдельно, .. Чтобы ключевое слово IN работало, запрос должен быть

SELECT DISTINCT FROM mytable WHERE name IN ('pall mall cigarettes')

но

SELECT DISTINCT FROM mytable WHERE name IN ('mall')

вернет 0 строк

Я не мог понять, как составить запрос, который бы соответствовал столбцам имени и описания и позволял частичное совпадение слов.

Может кто-нибудь помочь?

Обновление:

Я создал таблицу через hibernate и для поля описания использовал javax.persistence @Lob annotation. Используя psql, когда я исследовал таблицу, она отображается

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

Одна из записей в таблице, как,

id | description | name 
21 | 133414      | magic marker

Ответы [ 2 ]

23 голосов
/ 24 августа 2011

Прежде всего, этот подход не будет масштабироваться в целом, вам понадобится отдельный индекс от слов к элементу (например, инвертированный индекс).

Если ваши данные не велики, вы можете сделать

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

с использованием OR, если у вас несколько ключевых слов.

5 голосов
/ 24 августа 2011

Это также может сработать.

SELECT * 
FROM myTable
WHERE CHARINDEX('mall', name) > 0
  OR CHARINDEX('mall', description) > 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...