Вы можете решить проблему чувствительной к регистру функции REPLACE()
в mysql, используя LOWER()
.
Это небрежно, но с моей стороны этот запрос выполняется довольно быстро.
Чтобы ускорить процесс, я извлекаю набор результатов из выбора, который я объявил как производную таблицу в моем «внешнем» запросе. Поскольку mysql уже имеет результаты на данный момент, метод replace работает довольно быстро.
Я создал запрос, аналогичный приведенному ниже, для поиска нескольких терминов в нескольких таблицах и нескольких столбцах. Я получаю число «релевантность», эквивалентное сумме подсчета всех вхождений всех найденных поисковых терминов во всех столбцах, в которых был произведен поиск
SELECT DISTINCT (
((length(x.ent_title) - length(replace(LOWER(x.ent_title),LOWER('there'),''))) / length('there'))
+ ((length(x.ent_content) - length(replace(LOWER(x.ent_content),LOWER('there'),''))) / length('there'))
+ ((length(x.ent_title) - length(replace(LOWER(x.ent_title),LOWER('another'),''))) / length('another'))
+ ((length(x.ent_content) - length(replace(LOWER(x.ent_content),LOWER('another'),''))) / length('another'))
) as relevance,
x.ent_type,
x.ent_id,
x.this_id as anchor,
page.page_name
FROM (
(SELECT
'Foo' as ent_type,
sp.sp_id as ent_id,
sp.page_id as this_id,
sp.title as ent_title,
sp.content as ent_content,
sp.page_id as page_id
FROM sp
WHERE (sp.title LIKE '%there%' OR sp.content LIKE '%there%' OR sp.title LIKE '%another%' OR sp.content LIKE '%another%' ) AND (sp_content.title NOT LIKE '%goes%' AND sp_content.content NOT LIKE '%goes%')
) UNION (
[search a different table here.....]
)
) as x
JOIN page ON page.page_id = x.page_id
WHERE page.rstatus = 'ACTIVE'
ORDER BY relevance DESC, ent_title;
Надеюсь, это кому-нибудь поможет
- Seacrest out