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

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

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

Зато наткнулся на функцию INTERVAL, которая умеет вычислять не попадает ли указанное в заданный интервал и выдавать, в зависимости от этого ноль или один. Прикинул, должно помочь и действительно, такой запрос вычисляется на ура:
SELECT document_id, INTERVAL(document_id, 1447, 23007) AS intr
FROM cardsmain, cardsdelta
WHERE intr=0
12 сентября 2013 22:19

spiridonov@gmail.com (инкогнито)
13 сентября 2013, 11:52

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

Евгений Степанищев (bolknote.ru)
13 сентября 2013, 12:15, ответ предназначен spiridonov@gmail.com

Спасибо! :)

hshhhhh (hshhhhh.name)
13 сентября 2013, 14:29, ответ предназначен Евгений Степанищев (bolknote.ru):

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

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

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

Евгений Степанищев (bolknote.ru)
13 сентября 2013, 15:15, ответ предназначен hshhhhh (hshhhhh.name):

Что-то я не понял. Тебе нужно выбрать все записи которые между id 1 и 3, или тебе нужно выбрать все записи и использовать получить при этом флаг было ли оно между id 1 и 3?
Мне нужно выбрать записи ID которых не попадает в диапазон от 1447 до 23007. Очевидно же, по-моему.
Что-то я не понимаю в чем пользо от interval() в select, а не в where каком (хотя там он не будет работать).
Польза от INTERVAL в SELECT в том, что это единственное место, где эта функция работает.
Почему это нельзя было сделать на стороне клиента?
Что сделать? Получить тучу данных и убрать ненужное?

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

hshhhhh (hshhhhh.name)
13 сентября 2013, 16:10, ответ предназначен Евгений Степанищев (bolknote.ru):

Мне нужно выбрать записи ID которых не попадает в диапазон от 1447 до 23007. Очевидно же, по-моему.
А. Я понял как оно работает. Не обратил внимание что INTERVAL() подставляется в WHERE. Хитро :).

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)