Определение базы данных для поиска Sphinx

Фон

Я создаю базу данных MySQL для хранения таких элементов, как курсы, где у одного курса может быть много атрибутов. Например:

Один курс может иметь один или все из следующих атрибутов:

  • Заголовок (varchar)
  • Дополнительный заголовок (varchar)
  • Описание (текст)
  • Дата
  • Время
  • Конкретное местоположение (varchar; например, Белый зал, комната 7)
  • Общее расположение (varchar; например, Лас-Вегас, Невада)
  • Координаты местоположения (плавающие; например, широта, долгота)
  • и т.п.

База данных настроена следующим образом:

Таблица, в которой хранится конкретная информация о курсе:

таблица курсов:

  • Course_ID (уникальный идентификатор первичного ключа для каждого курса)
  • Creator_ID (уникальный идентификатор создателя)
  • Creation_Date (дата и время создания курса)
  • Modified_Date (где это самая последняя отметка времени, когда курс был изменен)

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

Таблица course_attributes:

  • Attribute_ID (уникальный идентификатор для каждого атрибута)
  • Course_ID (ссылка на конкретный атрибут курса)
  • Атрибут (varchar, определяющий атрибут; например, 'title')
  • Значение (текст, содержащий значение указанного атрибута; например, «Название моего курса»)

Желание

Я хотел бы выполнить поиск в этой базе данных с помощью поиска sphinx. В этом поиске у меня есть разные поля с разным весом, например: «название» было бы важнее, чем «описание».

Конкретные поля поиска, которые я хотел бы иметь:

  • Заголовок
  • Дата
  • Местоположение (строка)
  • Местоположение (гео - широта / долгота)

Вопрос

Должен ли я определить View в Mysql для организации атрибутов в соответствии с «заголовком», «описанием» и т. д., или есть способ определить мой sphinx.conf , чтобы понять конкретные атрибуты?

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

Сообщите мне, если вам понадобятся дополнительные сведения, которые помогут мне найти решение.

Заранее благодарим за помощь

!--Обновлять--!

Хорошо, поэтому, прочитав некоторые ответы, я чувствую, что должен предоставить дополнительную информацию.

Широта / долгота

Атрибуты широты / долготы создаются мной внутри после получения общей строки местоположения. Я могу генерировать значения любым способом, а это означает, что я могу хранить их вместе в одном атрибуте lat / long как значения float lat, float long или любой другой желаемый формат. Это делается только после того, как они были сгенерированы из исходной строки местоположения и проверены. Это сделано для защиты от искаженных данных, как предлагали @ X-Zero и @Cody.

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

Оценка результатов поиска

Я знаю, как добавить веса к результатам в поисковом запросе Sphinx:

$cl->setFieldWeights( array('title'=>1000, 'description'=>500) );

Это приводит к тому, что столбец title имеет больший вес, чем столбец description, если структура соответствует предложенной @ X-Zero. Мой вопрос был больше направлен на то, как применить приведенную выше логику к текущему определению таблицы.

Структура базы данных, представления и эффективность

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

Я не очень уверен в структурах базы данных, но я установил свои таблицы, как описано, потому что во многих случаях не все поля будут заполнены для каждого курса, и я пытался будь работоспособным [да, похоже, что я потерпел неудачу].

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


person ServAce85    schedule 20.10.2011    source источник


Ответы (2)


В конфигурации sphinx вы определяете свой индекс и запросы SQL, которые его заполняют. Вы можете определить основные атрибуты, см. Атрибуты Sphinx

Sphinx также поддерживает географический поиск по широте и долготе, но он должен быть выражен в радианах, а не в текстовых столбцах, как у вас. Я согласен с X-Zero, что хранить значения широты и долготы в виде строк - это плохая идея.

person Cody Caughlan    schedule 20.10.2011

person    schedule
comment
Спасибо за ваш ответ. Я обновил вопрос, чтобы учесть некоторые из ваших опасений и, надеюсь, получить от вас дополнительные рекомендации относительно того, какой должна быть лучшая структура. - person ServAce85; 20.10.2011
comment
Вот это да. Более подробного ответа я не мог просить. Насколько я могу судить, теперь все обретает смысл. Спасибо за помощь. Я приму все, что вы сказали, пересмотрю свои потребности и внесу соответствующие поправки. - person ServAce85; 21.10.2011