Поиск по ключевым словам с использованием PHP MySql? - PullRequest
2 голосов
/ 11 июня 2009

В моей таблице mysql есть поля заголовка (varchar), описания (текст), ключевых слов (varchar).

Я сохранил поле ключевых слов, так как думал, что буду искать только в этом поле. Но теперь мне нужно искать среди всех трех полей. поэтому для ключевых слов "word1 word2 word3" мой запрос становится

SELECT * FROM myTable
WHERE (
name LIKE '%word1%' OR description LIKE '%word1%' OR keywords LIKE '%word1%' 
OR name LIKE '%word2%' OR description LIKE '%word2%' OR keywords LIKE '%word2%' 
OR name LIKE '%word3%' OR description LIKE '%word3%' OR keywords LIKE '%word3%') 
AND status = 'live'

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

So

  • Считаете ли вы, что приведенный выше способ является грязным и вызовет проблемы по мере роста данных?

  • Как мне избежать беспорядка выше? Есть ли какое-нибудь более чистое решение, которое я могу найти Любой пример поможет мне.

  • Есть ли другой метод / метод, который вы можете порекомендовать мне?

С благодарностью

EDIT

@ Питер Стуифзанд предложил мне, чтобы я мог создать одну таблицу search_index и сохранить все 3 поля (название, ключевое слово, описание) и выполнить полнотекстовый поиск. Я понимаю, что дополнительно эта таблица будет также включать ссылку на первичный ключ myTable.

Но мой расширенный поиск может включать в себя соединение mytable с таблицей категорий, таблицей географического расположения (для поиска в пределах 10, 20 миль и т. Д.), Фильтрацию по некоторым другим критериям и, конечно же, сортировку результатов поиска. Как вы думаете, использование полного текста MySQL не замедлит его?

Ответы [ 4 ]

3 голосов
/ 11 июня 2009

Когда ваши запросы выходят из-под контроля, иногда лучше написать их части на SQL, а другие части - на вашем языке программирования.

И вы также можете использовать полнотекстовый поиск для поиска. Вы можете создать отдельную таблицу со всеми полями, которые вы хотите найти, и добавить модификатор FULLTEXT.

CREATE TABLE `search_index` (
    `id` INT NOT NULL,
    `data` TEXT FULLTEXT,
);

SELECT `id` FROM `search_index` WHERE MATCH(`data`) AGAINST('word1 word2 word3');
1 голос
/ 11 июня 2009

Еще один способ (иногда лучше, но это зависит ...)

SELECT 
    id, name, description, keywords 
FROM 
    myTable
WHERE
    name REGEXP '.*(word1|word2|word3).*' OR
    description REGEXP '.*(word1|word2|word3).*' OR
    keywords REGEXP '.*(word1|word2|word3).*'
;

PS: Но MATCH(cols) AGAINST('expr') возможно лучше для вашего случая.

0 голосов
/ 11 июня 2009

Учитывая расширенные требования, вы можете рассмотреть возможность использования apache solr (см. http://lucene.apache.org/solr/), это граненый поисковый движок, предназначенный для полнотекстового поиска. Он имеет интерфейс RESTful, который может возвращать XML или JSON. использование его с несколькими проектами - работает хорошо.

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

0 голосов
/ 11 июня 2009

Если это вообще возможно, вы должны изучить полнотекстовый поиск .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...