Пишу, по большей части, про историю, свою жизнь и немного про программирование.

NOT BETWEEN в «Сфинксе»

Я на этой неделе важный проект сдаю, мы там поиск на «Сфинксе» используем. «Сфинкс» поддерживает специальный язык запросов — SphinxQL, отличная штука, очень похожая на SQL, только, к сожалению, очень урезанный.

Понадобилось сделать запрос, содержащий NOT BETWEEN, а как назло оказалось, что такую конструкцию «Сфинкс» пока (?) не поддерживает. На всех форумах плач и стенания, решения нет. Бился-бился, даже скачал исходный код и посмотрел как парсер работает, действительно — не умеет он такого.

Зато наткнулся на функцию INTERVAL, которая умеет вычислять не попадает ли указанное в заданный интервал и выдавать, в зависимости от этого ноль или один. Прикинул, должно помочь и действительно, такой запрос вычисляется на ура:

SELECT document_id, INTERVAL(document_id, 1447, 23007) AS intr
FROM cardsmain, cardsdelta
WHERE intr=0
5 комментариев
spiridonov@gmail.com 2013

С днем рождения!
Пусть твоя поразительная работоспособность и тяга к новым знаниям не угасает долго-долго :)

Евгений Степанищев (bolknote.ru) 2013

Комментарий для spiridonov@gmail.com:

Спасибо! :)

hshhhhh (hshhhhh.name) 2013

Комментарий для Евгения Степанищева:

Что-то я не понял. Тебе нужно выбрать все записи которые между id 1 и 3, или тебе нужно выбрать все записи и использовать получить при этом флаг было ли оно между id 1 и 3?

Что-то я не понимаю в чем пользо от interval() в select, а не в where каком (хотя там он не будет работать). Просто это выглядит как будто ты просто маркируешь записи. Почему это нельзя было сделать на стороне клиента? Странное решение.

Ну и да, с этим, как его, с днем.

Евгений Степанищев (bolknote.ru) 2013

Комментарий для hshhhhh.name:

Что-то я не понял. Тебе нужно выбрать все записи которые между id 1 и 3, или тебе нужно выбрать все записи и использовать получить при этом флаг было ли оно между id 1 и 3?

Мне нужно выбрать записи ID которых не попадает в диапазон от 1447 до 23007. Очевидно же, по-моему.

Что-то я не понимаю в чем пользо от interval() в select, а не в where каком (хотя там он не будет работать).

Польза от INTERVAL в SELECT в том, что это единственное место, где эта функция работает.

Почему это нельзя было сделать на стороне клиента?

Что сделать? Получить тучу данных и убрать ненужное?

Во-первых, неясно зачем это делать на клиенте, если это делать должен поисковый сервер. Я, в принципе, вообще всё на клиенте могу делать, «сфинкс» не нужен. Во-вторых, у «сфинкса» есть ограничение на количество выдаваемых данных. Он не выдаст мне все данные, не сможет, у меня их миллионы. Так что вырезать ненужное я буду ценой недополучения нужного.

Ну и да, с этим, как его, с днем.

Как уж это… Спасибо, что ли.

hshhhhh (hshhhhh.name) 2013

Комментарий для Евгения Степанищева:

Мне нужно выбрать записи ID которых не попадает в диапазон от 1447 до 23007. Очевидно же, по-моему.

А. Я понял как оно работает. Не обратил внимание что INTERVAL() подставляется в WHERE. Хитро :).