Поиск по языкам

Чтобы посетитель находил страницы по словам на своём языке — и видел в выдаче результаты на нём же.

Две разные задачи

Находить — работает почти само. Индексная запись у элемента одна, и штатный индексатор кладёт в неё все свойства, помеченные как участвующие в поиске, включая языковые. Поэтому английский запрос элемент находит.

Показывать — требует одной строки в шаблоне. Заголовок и сниппет в выдаче собираются из базовых полей, поэтому без подмены посетитель английской версии находит нужный товар и видит его русское название.

IblockHelper::substituteSearchResults($arResult);

Подробности — search.page.

Что нужно, чтобы находилось

Языковые свойства должны участвовать в поиске.

Новое языковое свойство наследует эту настройку от исходного при создании. Языковые поля разделов создаются участвующими в поиске — но в старых версиях модуля у них стояло «нет», поэтому на давно работающих проектах настройку стоит проверить.

Индекс должен быть пересобран после создания свойств и после перевода. Модуль индексацией поиска не управляет: это штатный механизм Битрикса, и живёт он своим расписанием.

Чего подмена не делает

Не трогает записи чужих модулей — форума, обычных страниц — и записи разделов.

Не затирает базовый текст пустым переводом: русское название в выдаче лучше пустой строки.

На базовом языке не делает ничего.

Почему одна индексная запись, а не по одной на язык

Потому что так устроен поиск Битрикса, и менять это значило бы переписать его целиком.

У схемы есть приятное следствие: элемент находится по словам любого из языков. Посетитель английской версии, который ввёл русское название модели, товар всё равно найдёт.

И неприятное: релевантность считается по смеси языков в одной записи. На проектах с большим числом языков выдача от этого размывается, и лечится это только настройкой поиска, а не модулем.