Помешает ли зависимость между ключевыми словами реализовать функцию поиска с использованием функций полнотекстового поиска в СУБД? - PullRequest
0 голосов
/ 04 сентября 2018

Недавно мой руководитель поручил мне создать в веб-приложении функцию «пользовательского поиска», аналогичную существующей. Поиск данных происходит из нескольких таблиц, соединенных ключами или пространственно.

приблизительное представление о присоединениях

Хотя я думаю, что функции полнотекстового поиска по СУБД подойдут к этой функции, поскольку она с большей вероятностью выдаст релевантные результаты (упорядоченные по релевантности) и позволит настроить вес ключевых слов.

var sql = @"
SELECT ...
FROM TABLE_A 
LEFT OUTER JOIN TABLE_B ON ...
LEFT OUTER JOIN ...
OUTER APPLY (...) 
INNER JOIN CONTAINSTABLE(...) AS KEY_TBL ";

Мой супервайзер отклонил его и предлагает просто следовать существующей логике: создать поисковый запрос в бэк-энде. это выглядит так:

var sql = @"
SELECT ...
FROM TABLE_A 
LEFT OUTER JOIN TABLE_B ON ...
LEFT OUTER JOIN ...
OUTER APPLY (...) ";
var where = @" WHERE TABLE_A.DELETED = FALSE ";

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

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

У меня еще есть 2-3 дня, чтобы подготовиться к этому, и я хотел бы знать, были ли вышеуказанные причины действительными или нет. Кроме того, у меня есть опыт работы с CONTAINS, но не с CONTAINSTABLE. Может ли CONTAINSTABLE обрабатывать такие сложные запросы?

1 Ответ

0 голосов
/ 04 сентября 2018

Полнотекстовый поиск SQL эффективен для быстрого поиска данных, начинающихся с заданной строки. Насколько я знаю, CONTAINS поддерживает только поиск по префиксу (поиск по суффиксу не поддерживается), в то время как LIKE может достичь обоих.

Если вам нужна быстрая фильтрация запросов по определенным столбцам (даже если они находятся в разных таблицах) и вы принимаете тот факт, что поиск по суффиксам не является обязательным, я определенно остановлюсь на полнотекстовом поиске SQL.

Для фильтрации по столбцам из разных таблиц необходимо создать отдельный FULLTEXT INDEX для каждой таблицы.

Например, если у вас есть три таблицы (T1, T2, T3) с соответствующими им столбцами ([A, B, C] в T1, [D, E, F] в T2 и [G, H, I] в T3) сначала необходимо создать каталог:

CREATE FULLTEXT CATALOG CatalogName AS DEFAULT;

После этого вы должны создать FULLTEXT INDEXES.

CREATE FULL TEXT INDEX ON T1
(A, B, C) KEY INDEX INDEX_NAME ON CatalogName

CREATE FULL TEXT INDEX ON T2
(D, E) KEY INDEX INDEX_NAME ON CatalogName

CREATE FULL TEXT INDEX ON T3
(G) KEY INDEX INDEX_NAME ON CatalogName

После этого вы просто пишете свой SQL-запрос (с объединениями или другой логикой) и добавляете в свое WHERE предложение следующее:

WHERE CONTAINS((A, B, C), '"keyword*"'
OR CONTAINS((D, E), '"keyword*"'
OR CONTAINS((G), '"keyword*"'

Если ваши таблицы будут страдать от фрагментации, у вас может быть задача «Рабочая роль», которая проверяет таблицы и, при необходимости, перестраивает индексы.

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