Задать вопрос

Как правильно создавать сниппеты в дельта-индексах?

Добрый день.

Пытаюсь внедрить в приложение дельта-индексы.

Изначально был такой конфиг:

index search_content {
     # config
}


Запросы к нему шли типа

SELECT * FROM search_content WHERE MATCH('@(header, body) "test"');


Потом добавил дельту:

index search_content {
     # config
}

index search_content_delta : search_content {
     # config
}


Теперь чтобы искать в полном индексе (основной + дельта), нужно искать по обоим индексам сразу:

SELECT * FROM search_content, search_content_delta WHERE MATCH('@(header, body) "test"');


Но чтобы облегчить себе задачу и ради этого не добавлять в коде приложения в запросы название дельта индекса, переименовал основной индекс, сделал составной индекс из основного и дельта-индекса и назвал его как старый основной индекс - search_content:

index search_content_main {
     # config
}

index search_content_delta : search_content_main {
     # config
}

index search_content {
	local = search_content_main
	local = search_content_delta
}


Теперь, при том, что запросы к сфинксу остались без изменений
SELECT * FROM search_content WHERE MATCH('@(header, body) "test"');

сфинкс отлично возвращает данные из обоих индексов за один запрос: основного и дельты.

Однако по попытке составить сниппеты через CALL SNIPPETS из этого составного индекса, сфинкс ругается:

[1064] The distributed index for snippets must have exactly one local agent [ CALL SNIPPETS(('test string text'), 'search_content', 'test' ,'<b>' as `before_match`,'</b>' as `after_match`)]


Судя по всему, составные индексы из нескольких локальных индексов в сниппетах не поддерживаются.
Перечислить в CALL SNIPPETS индексы через запятую тоже выдает ошибку, синтаксис не позволяет.

В документации я найти что-то по этой теме не смог.

Собственно вопрос: можно ли составлять сниппеты одним запросом из основного и дельта индекса? Неважно, через составные индексы или еще как.
  • Вопрос задан
  • 3710 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
Добрый день.
Сниппеты работают немного не так как вы себе представляете. Индекс вам нужен только для того, что бы взять морфологию обработки строк. Сами строки вы передаёте в функцию CALL SNIPPETS. Стало быть вам достаточно будет использовать только основной индекс для получения морфологии.

Пример из доки:
CALL SNIPPETS('this is my document text', 'test1', 'hello world')
Документация говорит:
"It could be a single string, or the list of the strings enclosed in curly brackets. index is the name of the index from which to take the text processing settings. query is the full-text query to build snippets for."
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы