Меня научили хранить мои данные в MySQL как можно более сырыми.Вот пример того, как я храню контент в моей базе данных MySQL:
title (VARCHAR, 255) => Références
content (TEXT) => <p>A paragraph about références...</p>
Когда я выводю его на страницу, я использую htmlentities()
на title
, но, конечно, не на контенте.Я чувствую, что это правильный способ хранения, поскольку title
хранит только текст, а content
хранит HTML.
Однако теперь я вижу ограничение на это: когда я выполняю полнотекстовый поиск всоответствовать определенному ключевому слову (например, ссылки), мне нужно найти оба références
И références
, чтобы получить все результаты.
А теперь я думаю ... Как правильно решить эту проблему?
- Просмотрите базу данных и сохраните все с htmlentities?(Не хочу!)
- Есть два поиска, один для ключевого слова без htmlentities и один для другого с?(Мне не кажется оптимальным ...)
Просто для записи, вот мой огромный запрос MySQL, который ищет в page
, page_content
, article
, download
, member
и event
, так что у вас есть небольшая картина того, с чем я имею дело.
Заранее спасибо за ваши усилия.
$keyword = utf8_decode(mysql_real_escape_string($_POST['keyword']));
SELECT
*,
sum(score) AS total_score
FROM
(
SELECT
"page" as db_table,
lid,
sid as page_sid,
sid,
hook,
title,
meta_keywords,
meta_description,
NULL as content,
NULL as location,
NULL as company,
MATCH(title, meta_keywords, meta_description) AGAINST("'.$keyword.'*" IN BOOLEAN MODE) AS score
FROM page
WHERE MATCH(title, meta_keywords, meta_description) AGAINST("'.$keyword.'*" IN BOOLEAN MODE)
UNION
SELECT
"page_content" as db_table,
p.lid as lid,
pc.page_sid as page_sid,
NULL as sid,
NULL as hook,
p.title as title,
NULL as meta_keywords,
NULL as meta_description,
pc.content as content,
NULL as location,
NULL as company,
MATCH(content) AGAINST("'.$keyword.'*" IN BOOLEAN MODE) AS score
FROM page_content pc, page p
WHERE MATCH(content) AGAINST("'.$keyword.'*" IN BOOLEAN MODE)
AND p.sid = pc.page_sid
UNION
SELECT
"article" as db_table,
lid,
NULL as page_sid,
sid,
NULL as hook,
title,
meta_keywords,
meta_description,
content,
NULL as location,
NULL as company,
MATCH(meta_keywords, meta_description, title, content) AGAINST("'.$keyword.'*" IN BOOLEAN MODE) AS score
FROM article
WHERE MATCH(meta_keywords, meta_description, title, content) AGAINST("'.$keyword.'*" IN BOOLEAN MODE)
UNION
SELECT
"download" as db_table,
lid,
NULL as page_sid,
NULL as sid,
NULL as hook,
title,
NULL as meta_keywords,
NULL as meta_description,
content,
NULL as location,
NULL as company,
MATCH(title, content) AGAINST("'.$keyword.'*" IN BOOLEAN MODE) AS score
FROM download
WHERE MATCH(title, content) AGAINST("'.$keyword.'*" IN BOOLEAN MODE)
UNION
SELECT
"event" as db_table,
lid,
NULL as page_sid,
NULL as sid,
NULL as hook,
title,
NULL as meta_keywords,
NULL as meta_description,
content,
location,
NULL as company,
MATCH(title, content, location) AGAINST("'.$keyword.'*" IN BOOLEAN MODE) AS score
FROM event
WHERE MATCH(title, content, location) AGAINST("'.$keyword.'*" IN BOOLEAN MODE)
UNION
SELECT
"member" as db_table,
NULL as lid,
NULL as page_sid,
NULL as sid,
NULL as hook,
NULL as title,
NULL as meta_keywords,
NULL as meta_description,
NULL as content,
NULL as location,
company,
MATCH(company) AGAINST("'.$keyword.'*" IN BOOLEAN MODE) AS score
FROM member
WHERE MATCH(company) AGAINST("'.$keyword.'*" IN BOOLEAN MODE)
) AS sub_query
WHERE 1=1
GROUP BY page_sid
ORDER BY total_score DESC