Сложный SphinxQL Query - PullRequest
       5

Сложный SphinxQL Query

0 голосов
/ 20 ноября 2011

Я пытаюсь написать запрос SphinxQL, который бы дублировал следующий MySQL в индексе Sphinx RT:

SELECT id FROM table WHERE colA LIKE 'valA' AND (colB = valB OR colC = valC OR ... colX = valX ... OR colY LIKE 'valY' .. OR colZ LIKE 'valZ')

Как вы можете видеть, я пытаюсь получить все строки в одном строковом столбцесоответствует определенному значению, И соответствует любому из списка значений, который смешивает и сопоставляет строковые и целочисленные столбцы / значения)

Это то, что я до сих пор получал в SphinxQL:

SELECT id, (intColA = intValA OR intColB = intValB ...) as intCheck FROM rt_index WHERE MATCH('@requiredMatch = requiredValue');

Проблема, с которой я сталкиваюсь, заключается в сопоставлении всех возможных необязательных строковых значений.Наилучший из возможных запросов (если разрешено несколько операторов MATCH и они были разрешены в качестве выражений) будет выглядеть примерно так:

SELECT id, (intColA = intValA OR MATCH('@checkColA valA|valB') OR ...) as optionalMatches FROM rt_index WHERE optionalMatches = 1 AND MATCH('@requireCol requiredVal')

Я вижу потенциальный способ сделать это с помощью преобразования строк CRC32 и атрибутов MVA, но это не так.не поддерживается RT-индексами, и я ДЕЙСТВИТЕЛЬНО предпочел бы не переключаться с них.

1 Ответ

2 голосов
/ 21 ноября 2011

Один из способов - просто преобразовать все ваши столбцы в обычные поля. Затем вы можете поместить всю эту логику в MATCH (..). Т.е. не использовать атрибуты.

Да, вы можете иметь только один МАТЧ на запрос.

В противном случае, да, вы могли бы использовать трюк CRC, чтобы превратить строковые атрибуты в целочисленные, поэтому можете использовать для фильтрации.

Не знаю, зачем вам нужен MVA, но теперь они поддерживаются в индексах RT в 2.0.2

...