Сфинкс Поиск, составной ключ - PullRequest
1 голос
/ 01 декабря 2011

После моего предыдущего вопроса (/4853606/luchshii-sposob-poiska-chastichnyh-slov-v-bolshom-nabore-dannyh-mysql), я выбрал Sphinx в качестве поисковой системы над моей базой данных MySQL.

Я провел несколько небольших тестов, и это выглядит великолепно. Тем не менее, я сейчас нахожусь в точке, где мне нужна помощь / мнения.

У меня есть таблица статей (структура не важна), свойства таблицы (структура также не важна) и таблица со значениями каждого свойства в статье (это то, о чем это все). Таблица, в которой хранятся эти значения, имеет следующую структуру:

articleID   UNSIGNED INT
propertyID  UNSIGNED INT
value       VARCHAR(255)

Первичный ключ - это составной ключ articleID и propertyID.

Я хочу, чтобы Сфинкс искал столбец value. Однако для создания индекса в Sphinx мне нужен уникальный идентификатор. У меня нет прямо здесь. Также при поиске я хочу иметь возможность фильтровать по столбцу propertyID (например, искать только значения для propertyID 2, что я могу сделать, определив его как атрибут).

На форуме Sphinx я обнаружил, что могу создать многозначный атрибут и установить его как запрос для моего индекса Sphinx:

SELECT articleID, value, GROUP_CONCAT(propertyID) FROM t1 GROUP BY articleID

articleID теперь будет уникальным, но теперь я пропускаю значения. Так что я уверен, что это не решение, верно?

Есть несколько других опций, например:

  • Добавить дополнительный столбец в таблицу, который является уникальным
  • Создать вычисленное уникальное значение в запросе (например, articleID*100000+propertyID)

Есть ли другие варианты, которые я мог бы использовать, и что бы вы сделали?

1 Ответ

1 голос
/ 01 декабря 2011

В ваших предложениях

  • Добавить дополнительный столбец в таблицу, который является уникальным

Этого нельзя сделать для существующей таблицы с большим числомзаписей, поскольку добавление нового поля в большую таблицу занимает некоторое время, и в течение этого времени база данных не будет реагировать.

  • Создать вычисленное уникальное значение в запросе (например, articleID * 100000).+ propertyID)

Если вы сделаете это, вы должны найти способ получить articleID и propertyID из вычисленного уникального идентификатора.

Другойальтернативный способ состоит в том, что вы можете создать новую таблицу, имеющую ключевое поле для sphinx и еще два поля для хранения articleID и propertyID.

  • new_sphinx_table со следующимиполя

    id - UNSIGNED INT / BIGINT

    articleID - UNSIGNED INT

    propertyID - UNSIGNED INT

Затем вы можете написатьзапрос на индексирование, как показано ниже

SELECT id, t1.articleID, t1.propertyID, value FROM t1 INNER JOIN new_sphinx_table nt ON t1.articleID  = nt.articleID AND t1.propertyID = nt.propertyID;

This - это пример, поэтому вы можете изменить его в соответствии с вашими требованиями.

То, что возвращает sphinx, соответствует значениям new_sphinx_table.id с другими приписанными столбцами.Вы можете получить результат, используя new_sphinx_table.id значения и присоединившись к вашей t1 именованной таблице и new_sphinx_table

...