Задавайте вопросы, мы ответим
Вы не зашли.
Всем привет!
Подскажите пожалуйста, как решить такую задачу:
Имеется таблица, которая содержит контент в формате html.
Нужно искать слова, только если они находятся вне тэгов.
Например: <a title="это слово игнорируем">это слово ищем</a>
Сейчас выполняется такой запрос:
SELECT * FROM pages_index
WHERE MATCH (page_title, page_content) AGAINST ('$search')
Как ограничить зону поиска?
Можно ли сделать так:
SELECT * FROM pages_index
WHERE MATCH (page_title, page_content) AGAINST ('$search') NOT REGEXP '<$search> ' ?
Неактивен
Насколько я знаю - нет. Имеет смысл сделать еще одну колонку, в которую класть чистый текст либо при внесении текста, либо периодически по крону. И в ней уже без тэгов искать. Текст чистится элементарной регуляркой \<[^^>]+\>
Неактивен
На самом деле, наверное, можно. Т.е. сначала выбрать строки по полнотекстовому
индексу, а потом дополнительно отсеять через RLIKE. Если лишних строк не очень
много будет выбираться, то overhead будет совсем небольшой, а переделывать не
нужно будет ничего
Неактивен
paulus написал:
... Т.е. сначала выбрать строки по полнотекстовому
индексу, а потом дополнительно отсеять через RLIKE. ...
Спасибо за ответ! Насколько я понимаю, RLIKE это синоним REGEXP?
Как же будет выглядеть синтаксис такого запроса, как у меня с добавлением REGEXP в конце или нет?
Неактивен
EXPLAIN посмотрите от запроса. Если индекс не хочет использовать — то надо будет
через подзапрос сделать. Т.е. что-то вида
SELECT * FROM ( SELECT по индексу ) t WHERE page_conent NOT RLIKE '…'
Неактивен