NOT BETWEEN в «Сфинксе»
Я на этой неделе важный проект сдаю, мы там поиск на «Сфинксе» используем. «Сфинкс» поддерживает специальный язык запросов — SphinxQL, отличная штука, очень похожая на SQL, только, к сожалению, очень урезанный.
Понадобилось сделать запрос, содержащий NOT BETWEEN, а как назло оказалось, что такую конструкцию «Сфинкс» пока (?) не поддерживает. На всех форумах плач и стенания, решения нет. Бился-бился, даже скачал исходный код и посмотрел как парсер работает, действительно — не умеет он такого.
Зато наткнулся на функцию INTERVAL, которая умеет вычислять не попадает ли указанное в заданный интервал и выдавать, в зависимости от этого ноль или один. Прикинул, должно помочь и действительно, такой запрос вычисляется на ура:
SELECT document_id, INTERVAL(document_id, 1447, 23007) AS intr
FROM cardsmain, cardsdelta
WHERE intr=0
С днем рождения!
Пусть твоя поразительная работоспособность и тяга к новым знаниям не угасает долго-долго :)
Комментарий для spiridonov@gmail.com:
Спасибо! :)
Комментарий для Евгения Степанищева:
Что-то я не понял. Тебе нужно выбрать все записи которые между id 1 и 3, или тебе нужно выбрать все записи и использовать получить при этом флаг было ли оно между id 1 и 3?
Что-то я не понимаю в чем пользо от interval() в select, а не в where каком (хотя там он не будет работать). Просто это выглядит как будто ты просто маркируешь записи. Почему это нельзя было сделать на стороне клиента? Странное решение.
Ну и да, с этим, как его, с днем.
Комментарий для hshhhhh.name:
Мне нужно выбрать записи ID которых не попадает в диапазон от 1447 до 23007. Очевидно же, по-моему.
Польза от INTERVAL в SELECT в том, что это единственное место, где эта функция работает.
Что сделать? Получить тучу данных и убрать ненужное?
Во-первых, неясно зачем это делать на клиенте, если это делать должен поисковый сервер. Я, в принципе, вообще всё на клиенте могу делать, «сфинкс» не нужен. Во-вторых, у «сфинкса» есть ограничение на количество выдаваемых данных. Он не выдаст мне все данные, не сможет, у меня их миллионы. Так что вырезать ненужное я буду ценой недополучения нужного.
Как уж это… Спасибо, что ли.
Комментарий для Евгения Степанищева:
А. Я понял как оно работает. Не обратил внимание что INTERVAL() подставляется в WHERE. Хитро :).