Mitlas (mitlas) wrote,
Mitlas
mitlas

Category:

sphinx search и строковые id

Писать свой грамматический поиск для больших объёмов информации - долго и бессмысленно. Потому, разумным выходом остаётся использование Lucene или Sphinx. Первая написана на Java и требует инсталляции на сервер, в общем-то, ненужных в каждодневной жизни пакетов. Итак, остановимся на Sphinx, который, к тому же, написан нашим соотечественником и прекрасно подходит для русского языка.

Sphinx элементарно инсталлируется из портов FreeBSD и единственное, что необходимо сделать - подправить /usr/local/etc/sphinx.conf, и добавить sphinxsearch_enable="YES" в /etc/rc,conf. Для того, чтобы всё это было доступно в PHP - ставим порт /usr/ports/www/pecl-sphinx и проверяем, что в /usr/local/lib/php.ini присутствует строка вроде extension="/usr/local/lib/php/20090626/sphinx.so".

Однако, если в базе данных применяются не цифровые id, а, например, цифро-буквенные ключи длиной 32 символа (для уникальности и возможности сливать вместе разные базы или их бэкапы) - indexer будет пропускать все id, не начинающиеся на цифру, а прочие - урезать до первой встретившейся буквы. Обидно.

Для решения данной задачи делаем следующий трюк - в sphinx.conf добавляем строки:

sql_query_pre = SELECT @id:=0

sql_query = \
SELECT @id:=@id+1, id AS real_id, title, teaser, message \
FROM documents

sql_attr_string = real_id


теперь, и PHP, и утилита search - будут выдавать и реальный id записи.
Tags: programming
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 0 comments