PHP и MySQL выполняют поиск по множеству столбцов

Мне нужен способ поиска по 50+ столбцам, как varchar, так и int, в определенной таблице. Я видел, как люди рекомендуют Lucene и Sphinx, но я понятия не имею, как их использовать, а полнотекстовый MySQL не позволит мне объединить более 16 столбцов или оба столбца varchar и int.


person Community    schedule 25.08.2009    source источник


Ответы (2)


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

person chaos    schedule 25.08.2009
comment
проблема в том, что на данный момент имеется примерно 65 000 строк, из которых еженедельно добавляется около 500. - person ; 25.08.2009
comment
Если 500 находятся в пакете, а не случайным образом, было бы легко восстановить производную таблицу после пакета. Однако, если предположить, что вставки приходят в случайное время, 500 в неделю — это в среднем немногим больше, чем одна в час. Вероятно, вы могли бы запускать ежеминутное задание cron, которое регенерировало бы производную таблицу, если бы были сделаны какие-либо изменения, и не чувствовало бы особой боли. - person chaos; 25.08.2009
comment
+1 для денормализованной таблицы с индексами MySQL FULLTEXT. Я бы посмотрел на сфинкса как на первый вариант. - person James C; 26.08.2009

Возможно, вы захотите рассмотреть возможность поворота стола и его небольшого измельчения. Возьмите все ваши столбцы varchar и сохраните данные в одной таблице "Search_Strings"; сделайте то же самое для столбцов int:

исходная таблица

id
always_field1
always_field2
varstring1
...
varstringx
int1
...
inty

новая main_table (то же количество строк, что и исходная таблица, но очень мало столбцов)

id
always_field1
always_field2 

Строки_Поиска (

id (FK to main_table)
old_column_name
string_value

Search_Ints

id (FK to main_table)
old_column_name
int_value

При такой настройке вам нужен полнотекстовый индекс только для string_value. Извините, я не могу ничего предложить по Sphinx или Lucene, так как я с ними не знаком.

person dnagirl    schedule 25.08.2009
comment
Чтобы проиндексировать эту таблицу строк с помощью Sphinx, вам просто нужно убедиться, что таблица строк имеет уникальный ключ идентификатора (подумайте о последовательности). cf: postneo.com/2009/02/06/sphinx- поиск с помощью postgresql - person Gregg Lind; 26.08.2009