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

0

Скажем, у меня две таблицы:

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

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

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

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

Теги:
join
keyword
tagging

1 ответ

2
Лучший ответ

Полнотекстовое индексирование - это правильный способ сделать это, если вы планируете иметь много строк. Вы можете использовать родное решение 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 Qaru     | 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)
  • 0
    Здорово, спасибо. Я пойду за опцией индексирования, но также полезно знать, что объединение позаботится об этом, если набор данных будет достаточно маленьким (после многих попыток я все еще не могу сохранить прямые соединения ...).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню