Добрый день, хочу подружить Views с Sphinx поисковым движком.
Т.е. имеется сторонняя база с таблицей у которой в качестве движка таблицы используется SPHINX
Т.е. можно через неё обращаться к индекс с помощью SphinxQL
Хочу эту базу подключить в settings.php и во вьюхе с помощью hook_views_data обращаться к этой таблице.
Однако есть один нюанс, у SphinxQL там параметр фильтра передаются в
query='test;sort=attr_asc:group_id';
И в этом query могут быть как и текст запроса, вид сортировки, кол-во результатов
Получается нужно у вьюхи её WHERE FIELD LIKE как минимум поменять на этот query
И как максимум ORDER BY на sort из query
Т.е. сделать как здесь https://mariadb.com/kb/en/library/about-sphinxse/#search-options
Комментарии
Почему не использовать какой-нибудь Search API Sphinx?
Я сначала тоже хотел посоветовать, только если Searchlight.
Но у него сфинкс крутится в Марие, и соответственно, доступ к ней идёт идут по ее протоколу
Да, только я хочу использую Views через SphinxQL как бы селектить сторонний индекс, т.е. индекс не имеющий никакого отношения к друпалу
Ага, перечитал, и понял боль.
И, если правильно понял - должен помочь hook_views_query_alter. Парсинг, конечно же, на плечах альтерирующего.
А я вот думаю, а способен ли этот хук так кардинально запрос поменять? :/
Ну, с помощью этого хука можно полностью переписать сам запрос. Прийдется, правда, разобраться во Views'овском
бардакеAPI, Devel - в помощь.В любом случае, нужно пробовать. В теории, это то место, откуда нужно стартовать, а потом уже по результату ориентироваться. Кейс не самый стандартный, нет выработанного шаблона, потому прорубливать тернии - автору задачки.
Да, может.
Как-то потребовался блок со списком наличия товара в магазинах, наличие бралось запросом к стороннему сервису.
Удобнее было сделать это вьюсом - права доступа, кеширование, порядок следования полей и т.д.
Был сделан альтер вьюсового запроса - чтобы дергать внешний сервис, и добавлять его результаты в выдаче вьюса.
Только пришлось задействовать 2 хука:
hook_views_query_alter() - альтерим запрос и делаем вызов внешнего сервиса
hook_views_pre_render() - добавляем в результаты вьюса данные полученные от сервиса
Прям в hook_views_query_alter() запрос к сервису вписал?
ага, у внешнего сервиса - свои ID магазинов, они потом подставлялись в качестве значений аргументов вьюса, чтобы вытащить список нужных магазинов
Нужно во hook_views_data, где вы описываете поля таблицы, использовать свои хендлеры для чтения/фильтрации/аргументации для каждого поля. В каждом таком хендлере необходимо реализовать query alter и изменить или полностью переписать запрос под нужные требования.
все методы https://api.drupal.org/api/views/handlers%21views_handler_field.inc/clas...
ps Возможно, проще это сделать без вьюса
В чём преимущество такого странного решения перед стандартным сфинксом?
А что вы под стандартным имеете ввиду?
Через сёрч апи
Тут другой случай, я хочу отображать сторонний индекс, не друпала. Использовать Views как инструмент отображения
Когда-то ковырял Сфинкс.. прикольная штука.. У него же вроде почти SQL-совместимый язык запросов.
Т.е. теоретически можно драйвер БД для друпал написать и использовать как родной..
Руки до сих пор чешутся, но пока не актуально.
Я вот и думаю, это же по идее нужно просто как то хитро вьюху переделать, свои хэндлеры фильтры сделать (как правильно выше подметили, с помощь hook_views_data указать свои виды хэндлеров для обычных фильтров и контекстных для определенных полей)
И тогда было бы вообще здорово, подключить левую базу (MariaDB + SphinxSE) и с помощью вьюхи обращаться к индексы движка с пулемётной скоростью
Это может не очень применимо в онлайн, я же у себя хочу это на работе сделать, в интранете где полно различных приложений, информации связаной с производством и т.п.
Можно было бы свой поиск сделать по огромным источникам информации и с легкостью его накликать во вьюхе, или ещё больше, сделать мультипоиск по несколько индексам в раз. (google в интранете сделать )
Фишка хэндлеров в том, что они пишутся один раз и потом их можно использовать в разных вьюхах. Надо смотреть, как устроены стандартные хэндлеры и делать свои по образу и подобию. Вообще на восьмёрке это сделать значительно проще из-за более грамотной структуры кода.