Таблица search_index
Таблица search_index является центральной таблицей для хранения поискового индекса в Drupal. Она содержит отдельные слова, извлеченные в процессе индексации из содержимого узлов (нод), комментариев, пользовательских профилей и других индексируемых сущностей. Каждое слово связывается с конкретным фрагментом контента (sid) и типом контента (type), что позволяет быстро находить релевантные результаты при выполнении поисковых запросов.
Поля
| Поле | Тип данных | Описание |
|---|---|---|
word |
varchar(50) |
Слово, которое было извлечено и проиндексировано. Одно из ключевых полей для поиска. |
sid |
int |
Идентификатор искомого элемента (Search ID). Ссылается на ID элемента в основной таблице индекса search_dataset.
|
type |
varchar(16) |
Тип индексируемого элемента. Обычно соответствует машинному имени типа контента (ноды), модуля (например, user для пользователей) или другого типа сущности.
|
score |
float |
Вес слова. Определяет релевантность слова в данном фрагменте контента. Зависит от того, в каком поле (заголовок, тело, теги) было найдено слово. |
language |
varchar(12) |
Язык, для которого проиндексировано слово. Соответствует языковому коду (например, en, ru). Позволяет осуществлять поиск в рамках определенного языка на мультиязычных сайтах.
|
Как это работает
Когда контент создается или обновляется, Drupal запускает процесс индексации. Текст из различных полей (заголовок, основное тело, поля с текстом) разбивается на отдельные слова (токенизируется). Слова очищаются от окончаний (стемминг) и приводятся к нижнему регистру. Для каждого такого слова в таблицу search_index добавляется запись, которая связывает это слово с ID проиндексированного элемента (sid), его типом (type) и языком (language).
При выполнении пользователем поискового запроса, его фраза также разбивается на слова. Для каждого слова система ищет совпадения в поле word. Затем результаты по всем словам из запроса агрегируются, вычисляется общий рейтинг релевантности для каждого элемента (sid) на основе суммы весов (score), и результаты сортируются по убыванию этого рейтинга.
Для связи с исходными данными используется таблица search_dataset, в которой по sid хранится информация о том, к какой именно сущности (ноде, комментарию, пользователю) относится индекс, а также timestamp последнего обновления.
Поле score играет ключевую роль в ранжировании. Разные части контента имеют разный вес. Например, слово, найденное в заголовке (title), обычно имеет больший вес, чем слово, найденное в теле текста (body), что повышает релевантность этого результата.
Пример SQL-запроса
Найти 10 самых релевантных нод типа 'article', содержащих слова 'drupal' и 'модуль', можно следующим запросом:
SELECT i.sid, SUM(i.score) AS total_score, d.data
FROM search_index i
INNER JOIN search_dataset d ON i.sid = d.sid AND i.type = d.type
WHERE i.word IN ('drupal', 'модуль')
AND i.type = 'node'
AND d.type = 'node'
GROUP BY i.sid, d.data
ORDER BY total_score DESC
LIMIT 10;
Смотрите также
-
таблицу
search_dataset,
которая хранит связь индексных ID с сущностями и их данные -
таблицу
search_total,
которая хранит общую статистику поисковых слов -
таблицу
node,
которая является основной таблицей для хранения материалов (нод) -
таблицу
users,
которая хранит данные пользователей, также доступных для индексации