Объединение нескольких таблиц SphinxSE в одном запросе - PullRequest
0 голосов
/ 30 ноября 2011

Я пытаюсь написать запрос, который объединяет несколько таблиц из MySQL с двумя таблицами SphinxSE.По сути, это база данных типа «каждая строка имеет два имени», и каждое из этих двух имен является индексом, связанным с таблицей SphinxSE ... Моя цель состоит в том, чтобы выполнить поиск, который в основном «любое из имен соответствует этой строкев Sphinx ".

Я попытался использовать следующий запрос:

SELECT * from names
LEFT JOIN name_1_se ON name_1_se.id=names.name_1_id
LEFT JOIN name_2_se ON name_2_se.id=names.name_2_id
WHERE name_1_se.query=('some random name;mode=phrase;limit=100000;maxmatches=100000')
OR name_2_se.query=('some random name;mode=phrase;limit=100000;maxmatches=100000')

(таблицы name_1_se и name_2_se являются таблицами SphinxSE).

Если я использую толькоодиночный поиск в месте, он работает нормально ... добавление второго предложения (любого), которое заставляет два 'поиска' SphinxSE, заставляет результаты возвращаться пустыми.

Возможно ли то, что я пытаюсь сделать, илиэто известная проблема со SphinxSE?Самым близким, что я смог найти на сайте Сфинкса, была эта ошибка http://sphinxsearch.com/bugs/view.php?id=255 с 2008 года.

Спасибо!

1 Ответ

2 голосов
/ 02 декабря 2011

Нет, это не сработает.Это из-за «архитектуры» sphinxSE / mysql.

Sphinx, конечно, не представляет реальные таблицы в MySQL.Он притворяется своим столом.Он говорит, что оптимизатор запросов mysql очень хорошо работает через индексы.Поэтому оптимизатор всегда должен выбирать таблицу SphinxSE «сначала», которая затем соединяется с реальной таблицей mysql.

Таким образом, для каждой строки выполняется сканирование индекса для таблицы SphinxSE, которая получает doc_ids.и затем он ищет их в исходной таблице (само соединение).

SphinxSE не может существовать с правой стороны соединения.Всегда должен быть первым (или оставленным).

... ваш запрос (с использованием левого соединения) заставляет mysql поместить таблицу sphinxSE (ну и таблицы не меньше!) Справа, которая просто не будет работать.


Вам нужно преобразовать запрос в одну таблицу sphinxSE.Таблица sphinxSE может искать несколько индексов sphinx одновременно.Или, может быть, можно изменить ваши фактические индексы так, чтобы они составляли один индекс.

Помните, что для каждого индекса может быть несколько полей - поэтому может быть использован расширенный запрос

(@ field1 "какое-то случайное имя ") |(@ field2 "какое-то случайное имя")

... результат одной таблицы sphinxSE (слева от объединения :)).


Обновлено для добавления:

Создание sphinxSE для поиска по двум индексам одновременно (например, sql UNION) почти наверняка вы можете сделать

CREATE TABLE ... CONNECTION="sphinx://localhost:9312/index1,index2";

, но дажеесли вы не можете, переопределение во время запроса должно определенно сработать, например из документов:

... WHERE query='test;index=test1,test2,test3;';

Индекс, определенный в таблице, будет игнорироваться, поэтому можно использовать любую таблицу sphinxSE.

...