Перекрестная проверка одной таблицы текстового содержимого MySQL против другой таблицы ключевых слов - PullRequest
0 голосов
/ 21 сентября 2010

Допустим, у меня есть две таблицы:

В таблице 1 есть столбцы NOTE_ID (уникальный ключ) и NOTE_BODY (большой текстовый текст).

В таблице 2 есть столбцы KEYWORD_ID (aуникальный ключ) и KEYWORD (ключевое слово).

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

Как правильно это сделать?Я не уверен, что JOIN + LIKE '%%' справится с задачей или я должен использовать полнотекстовую индексацию.Любая помощь высоко ценится ...

1 Ответ

2 голосов
/ 21 сентября 2010

Решение для полнотекстовой индексации является правильным способом сделать это, если вы планируете иметь много строк. Вы можете использовать родное решение MySQL , если вы используете MyISAM механизм хранения, но вы также можете рассмотреть популярные сторонние поисковые системы Sphinx и Apache Lucene .

С другой стороны, простой INNER JOIN сделал бы трюк:

SELECT  t1.note_id, t1.note_body, t2.keyword
FROM    table_1 t1
JOIN    table_2 t2 ON (t1.note_body LIKE CONCAT('%', t2.keyword, '%'));

Контрольный пример:

CREATE TABLE table_1 (note_id int, note_body varchar(100));
CREATE TABLE table_2 (keyword_id int, keyword varchar(50));

INSERT INTO table_1 VALUES (1, 'Hello Stack Overflow');
INSERT INTO table_1 VALUES (2, 'Hello World');
INSERT INTO table_1 VALUES (3, 'Hello, my name is Daniel');
INSERT INTO table_1 VALUES (4, 'Goodbye');

INSERT INTO table_2 VALUES (1, 'Hello');
INSERT INTO table_2 VALUES (2, 'name');

Результат:

+---------+--------------------------+---------+
| note_id | note_body                | keyword |
+---------+--------------------------+---------+
|       1 | Hello Stack Overflow     | Hello   |
|       2 | Hello World              | Hello   |
|       3 | Hello, my name is Daniel | Hello   |
|       3 | Hello, my name is Daniel | name    |
+---------+--------------------------+---------+
4 rows in set (0.00 sec)
...