Как реализовать поиск по ключевым словам в MySQL? - PullRequest
33 голосов
/ 17 апреля 2009

Я новичок в программировании на SQL.

У меня есть табличное задание с полями id, position, category, location, salary range, description, refno.

Я хочу реализовать поиск по ключевым словам из внешнего интерфейса. Ключевое слово может находиться в любом из полей приведенной выше таблицы.

Это запрос, который я пробовал, но он состоит из множества повторяющихся строк:

SELECT
    a.*,
    b.catname
FROM
    job a,
    category b
WHERE
    a.catid = b.catid AND
    a.jobsalrange = '15001-20000' AND
    a.jobloc = 'Berkshire' AND
    a.jobpos LIKE '%sales%' OR
    a.jobloc LIKE '%sales%' OR
    a.jobsal LIKE '%sales%' OR
    a.jobref LIKE '%sales%' OR
    a.jobemail LIKE '%sales%' OR
    a.jobsalrange LIKE '%sales%' OR
    b.catname LIKE '%sales%'

Ответы [ 7 ]

51 голосов
/ 17 апреля 2009

Для одного ключевого слова в полях VARCHAR вы можете использовать LIKE:

SELECT id, category, location
FROM table
WHERE
(
    category LIKE '%keyword%'
    OR location LIKE '%keyword%'
)

Для описания обычно лучше добавить полнотекстовый индекс и выполнить Полнотекстовый поиск (только для MyISAM):

SELECT id, description
FROM table
WHERE MATCH (description) AGAINST('keyword1 keyword2')
7 голосов
/ 17 апреля 2009
SELECT 
    *
FROM 
    yourtable
WHERE 
    id LIKE '%keyword%' 
    OR position LIKE '%keyword%'
    OR category LIKE '%keyword%'
    OR location LIKE '%keyword%'
    OR description LIKE '%keyword%'
    OR refno LIKE '%keyword%';
6 голосов
/ 17 апреля 2009

В идеале, иметь таблицу ключевых слов, содержащую поля:

Keyword
Id
Count (possibly)

с индексом по ключевому слову. Создайте триггер вставки / обновления / удаления для другой таблицы, чтобы при изменении строки каждое ключевое слово извлекалось и помещалось (или заменялось) в этой таблице.

Вам также понадобится таблица слов, чтобы не считаться ключевыми словами (если и так, но, ...).

Таким образом, вы получите лучшую скорость для запросов, ищущих ключевые слова, и сможете (относительно легко) реализовывать более сложные запросы, такие как «содержит Java и RCA1802».

"LIKE" запросов будут работать, но они также не будут масштабироваться.

5 голосов
/ 28 мая 2013

Вы можете найти другую более простую опцию в теме: Сопоставление с .. с более подробной справкой в ​​ 11.9.2 Булевы полнотекстовые поиски

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

Информация о том, как создавать индексы (MySQL): MySQL FULLTEXT Индексирование и поиск

В индексе FULLTEXT может быть указано более одного столбца, результатом будет оператор SQL с индексом с именем search:

SELECT *,MATCH (`column`) AGAINST('+keyword1* +keyword2* +keyword3*') as relevance  FROM `documents`USE INDEX(search) WHERE MATCH (`column`) AGAINST('+keyword1* +keyword2* +keyword3*' IN BOOLEAN MODE) ORDER BY relevance;

Я пробовал с несколькими столбцами, но не повезло. Несмотря на то, что в индексах допускается несколько столбцов, вам все равно нужен индекс для каждого столбца для использования с оператором Match / Against.

В зависимости от ваших критериев вы можете использовать любой из вариантов.

5 голосов
/ 17 апреля 2009

Лично я бы не использовал сравнение строк LIKE в поле идентификатора или любом другом числовом поле. Поиск по идентификатору № " 216 " не имеет смысла, чтобы вернуть 16 216 , 216 51, 3 216 087 53 216 68 ... и т. Д. И т. П .; аналогично с зарплатой.

Кроме того, если вы хотите использовать подготовленные операторы для предотвращения SQL-инъекций, вы должны использовать строку запроса, например:

SELECT * FROM job WHERE `position` LIKE CONCAT('%', ? ,'%') OR ...
4 голосов
/ 26 февраля 2013

Я объясню метод, который я обычно предпочитаю:

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

1) Добавьте поле (я обычно называю это «дайджест»), в котором вы храните все данные из таблицы.

Поле будет выглядеть так:

"n-n1-n2-n3-n4-n5-n6-n7-n8-n9" и т. Д. где n - одно слово

Я добился этого с помощью регулярного выражения, которое заменяет "" на "-". Это поле является результатом того, что все данные таблицы «переварены» в одну строку сигнатуры.

2) Используйте оператор LIKE% keyword% в поле дайджеста:

SELECT * FROM table WHERE digest LIKE %keyword%

вы даже можете создать qUery с небольшим циклом, чтобы вы могли искать несколько ключевых слов одновременно, выглядя так:

SELECT * FROM table WHERE 
 digest LIKE %keyword1% AND 
 digest LIKE %keyword2% AND 
 digest LIKE %keyword3% ... 
1 голос
/ 10 ноября 2017

Я знаю, что это немного поздно, но то, что я сделал с нашим приложением, это. Надеюсь, это поможет кому-то. Но у меня это работает:

SELECT * FROM `landmarks` WHERE `landmark_name` OR `landmark_description` OR `landmark_address` LIKE '%keyword'
OR `landmark_name` OR `landmark_description` OR `landmark_address` LIKE 'keyword%' 
OR `landmark_name` OR `landmark_description` OR `landmark_address` LIKE '%keyword%'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...