sphinx

Не так давно, я написал статью «FreeBSD. Установка и настройка Яндекс.Сервер» и пообещал в комментариях рассказать про поисковый движок Sphinx. Это одна из трех запланированных статей про этот замечательный поисковый движок, в следующих статьях расскажу про расширение для PHP и расширение для MySQL.

Операционная система, в которой будем производить установку и настройки — FreeBSD, но так же буду давать советы и для Windows-пользователей.

В качестве примера, будем разрабатывать поиск для моего блога на WordPress. Для самых не терпеливых, вот демонстрация работы поисковика http://demo.adw0rd.ru/sphinxsearch/.

Установка

Установка достаточно простая

# cd /usr/ports/textproc/sphinxsearch
# make config

Выбираем:

  • «mysql», если вы пользуетесь данной СУБД и хотите работать с данными непосредственно из Sphinx
  • «iconv» для поддержки разных кодировок
# make install

Вот и все, установка завершена!

Скачать исходники и Windows-версии можно тут: http://sphinxsearch.com/downloads.html.

После скачки Windows-версии, достаточно распаковать архив и указать в системной переменной «Path» полный путь до каталога \sphinx\bin.

Настройка

До начала поиска надо проиндексировать вашу информацию, создадим наш конфигурационный файл и укажем что и как индексировать, а также как отдавать результаты поиска.

Создадим конфигурационный файл для нашего поиска по блогу /home/sphinx/sphinx.conf:

source adw0rd_wp
{
        # Параметры подключения к БД
        type = mysql
        sql_host = localhost
        sql_user = user
        sql_pass = password
        sql_db = database_name
        sql_port = 3306

        # Установим кодировку для работы с БД
        sql_query_pre = SET NAMES utf8
        sql_query_pre = SET CHARACTER SET utf8

        # Запрос выборки данных для индексации
        sql_query = SELECT ID as post_id, post_title, post_content FROM wp_posts WHERE post_type = 'post'

        # Запрос доп. информации для вывода результата (используется утилитой "search")
        sql_query_info = SELECT * FROM wp_posts WHERE ID = $id

        # Время простоя (sleep) перед посылкой запросов серверу (предназначен для разгрузки сервера БД)
        # Если установите "= 1000", то засыпание будет длится 1 секунду
        sql_ranged_throttle = 0
}

index adw0rd_wp
{
        # Использовать соответствующий source-блок настроек при индексации
        source = adw0rd_wp

        # Путь до файлов индекса
        path = /home/sphinx/data/adw0rd_wp

        # Способ хранения индекса (none, inline, extern)
        # Подробнее http://www.sphinxsearch.com/docs/manual-0.9.8.html#conf-docinfo
        docinfo = extern

        # Memory lock (http://www.sphinxsearch.com/docs/manual-0.9.8.html#conf-mlock)
        mlock = 0

        # Использование английского и русского стемминга
        morphology = stem_enru

        # Минимальная длина индексируемого слова
        min_word_len = 2

        # Установка используемой кодировки
        charset_type = utf-8

        # Таблица символов (http://www.sphinxsearch.com/docs/manual-0.9.8.html#conf-charset-table)
        charset_table = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F

        # Минимальная длина инфикса (префикс в том числе)
        min_infix_len = 2

        # Использовать оператор усечения "*" (http://www.sphinxsearch.com/docs/manual-0.9.8.html#conf-enable-star)
        enable_star = 1
}

indexer
{
        # Максимальный лимит используемой памяти RAM
        mem_limit = 32M
}

searchd
{
        # Адрес сервера
        address = 127.0.0.1

        # Порт
        port = 3312

        # Лог
        log = /home/sphinx/log/searchd.log

        # Лог запросов
        query_log = /home/sphinx/log/query.log

        # Таймаут на соединение с сервером (в секундах). При истечении времени происходит обрыв
        read_timeout = 5

        # Максимальное кол-во потомков от процесса
        max_children = 30

        # Путь до pid-файла
        pid_file = /home/sphinx/log/searchd.pid

        # Максимальное кол-во результатов выдачи
        max_matches = 1000
}

Полная документация: http://www.sphinxsearch.com/docs/.

Разберем используемые нами SQL-запросы:

# Запрос выборки данных для индексации
sql_query = SELECT post_title, post_content FROM wp_posts WHERE post_type = 'post'

Тут мы выбираем заголовки и содержимое статей таблицы постов блога, при этом надо указать что типа поста — «post» (это та самая версия поста, которая считается опубликованной и текущей, так как есть еще ревизионные подверсии постов).


# Запрос доп. информации для вывода результата (используется утилитой "search")
sql_query_info = SELECT * FROM `wp_posts` WHERE `ID` = $id

Этот запрос применяется для вывода дополнительных данных результатов поиска используемый утилитой коммандной строки «search».

Индексация

Укажем в качестве конфига созданный нами конфигурационный файл:

# indexer --config /home/sphinx/sphinx.conf --all

Для обновления текущего индекса используйте «--rotate», он добавит к созданному индексу новые данные, а измененные соответственно изменит.

# indexer --config /home/sphinx/sphinx.conf --rotate

P.S. Если индексация не удалась, пишите комментарии к статье, посмотрим что случилось... :)

Использование поиска

Для поиска в консоли есть утилита «search»:

# search –-config /home/sphinx/sphinx.conf искомая комбинация

Запуск поискового сервера

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

# searchd –-config /home/sphinx/sphinx.conf

Далее, мы сможем использовать Sphinx API.

Использование Sphinx API для PHP

Для работы со Sphinx API необходимо подключить файл sphinxapi.php, вы можете найти эту библиотеку в поставке с дистрибутивом. Например для установки из портов FreeBSD — путь «/usr/ports/textproc/sphinxsearch/work/sphinx-0.9.8.1/api/sphinxapi.php», а для Windows — «sphinx\api\sphinxapi.php».

А теперь напишем скрипт для работы с проиндексируемыми данными поисковика, то есть для запросов искомых слов и вывода результатов поиска!

<html>
<head>
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
    <title>Sphinx search for Wordpress</title>
</head>
<body>

<form action="" method="get">
    <input name="s" size="40" value="<?php echo @$_GET['s'];?>" />
    <input type="submit" value="Искать!" />
</form>
<?php

if(isset($_GET['s']) and strlen($_GET['s']) > 2) {
   
    // Подключаем sphinx-api
    require_once ("sphinxapi.php");
   
    // Искомая комбинация
    $string = $_GET['s'];

    // Создаем объект клиента для Sphinx API
    $sphinx = new SphinxClient();

    // Подсоединяемся к Sphinx-серверу
    $sphinx->SetServer('localhost', 3312);
   
    // Совпадение по любому слову
    $sphinx->SetMatchMode(SPH_MATCH_ANY);
   
    // Результаты сортировать по релевантности
    $sphinx->SetSortMode(SPH_SORT_RELEVANCE);
   
    // Задаем полям веса (для подсчета релевантности)
    $sphinx->SetFieldWeights(array ('post_title' => 20, 'post_content' => 10));

    // Результат по запросу (* - использование всех индексов)
    $result = $sphinx->Query($string, '*');
   
    // Если есть результаты поиска, то
    if ($result && isset($result['matches']))
    {

        // Соединяемся с БД
        mysql_connect('localhost', 'user', 'password');
        mysql_select_db('adw0rd_wp');

        // Устанавливаем кодировки
        mysql_query('SET NAMES utf8');
        mysql_query('SET CHARACTER SET utf8');
       
        // Получаем массив ID постов блога
        $ids = array_keys($result['matches']);

        // Выводим посты отсортированные по релевантности
        $id_list = implode(',', $ids);
        $sql = '
            SELECT `ID`, `post_title`, `post_content`
                FROM `wp_posts`
                WHERE `ID` IN ('
.$id_list.')
                ORDER BY FIELD(`ID`, '
.$id_list.')';

        $resource = mysql_query($sql);

        // Выводим результаты поиска
        echo '<ol>';
        while ($result = mysql_fetch_assoc($resource)) {
            echo '<li><span><a href="http://adw0rd.ru/?p='.$result['ID'].'">'.$result['post_title'].'</a></span><div>'.mb_substr(htmlspecialchars($result['post_content']), 0, 400).'</div>';
        }
        echo '</ol>';
    }
}
?>
</body>
</html>

Документация по Sphinx API для PHP: http://www.sphinxsearch.com/wiki/doku.php?id=php_api_docs

Резюме

За короткое время нам удалось развернуть быстрейший «поисковый сервис своими руками», с возможностями полнотекстового поиска. Демонстрация работы: http://demo.adw0rd.ru/sphinxsearch/.

По всем вопросам, касающемся этой статьи пишите в комментарии.

P.S. Если вам не знакомы слова: «стемминг», «инфикс», «словоформа» и т.д., то существует проект Википедия, в которой можно с легкостью об этом узнать!


Комментарии (165) на запись «Sphinx. Установка, настройка и использование поискового движка»

» Трекбеки скрыты, показать их?
  1. phpdude | 15.06.2009 в 08:57

    ужас... так то это, столько слов а на деле все за пару минут поднимается)) сфинкс акуенен

  2. smackthat | 15.06.2009 в 11:47

    привет! пытаюсь поднять под windows xp. Так вот, я хочу попробывать поиск по базе, которая дается в качестве примера, где уже все настроенно. Там еще есть файл с SQL запросом, который создает таблицу documents и заполняет ее данными. Так вот при поиске через search я ввожу такую команду:

    search test

    а оно выдает:

    using config file './sphinx.conf'...
    index 'test1': search error: failed to open data/test1.sph: No such file or directory.

    что это за файл? и почему test1, я же написал просто test?

  3. adw0rd | 15.06.2009 в 13:35

    А ты как индексировал? И какой у тебя путь до конфига получился?

  4. Zona | 15.06.2009 в 15:37

    Имхо намного пижже, чем Яндекс-сервер! Убедился на личном опыте)

  5. aktuba | 15.06.2009 в 15:37

    А заказ на поднятие сфинкса для сайта возьмешь?

  6. adw0rd | 15.06.2009 в 15:55

    Zona, согласен, мне тоже больше нравится :)

  7. adw0rd | 15.06.2009 в 15:56

    aktuba, для какого сайта?

    Свой сервер? Виртуальный?

    Какой бюджет?

    пиши на x11org@gmail.com

  8. aktuba | 15.06.2009 в 15:58

    adw0rd: свои сервера, сайт nnm.ru =). Бюджет — хотелось бы у тебя услышать.

  9. smackthat | 15.06.2009 в 16:13

    путь к конфигу у меня получился «c:\Program Files\sphinx\bin\sphinx.conf». И еще такой вопрос. Я пытаюсь выполнить индексацию. Делаю так:

    C:\Program Files\sphinx\bin>indexer --all

    Sphinx 0.9.8-release (r1533)

    Copyright © 2001—2008, Andrew Aksyonoff

    using config file './sphinx.conf'...

    indexing index 'test1'...

    collected 4 docs, 0.0 MB

    sorted 0.0 Mhits, 100.0% done

    total 4 docs, 193 bytes

    total 0.152 sec, 1267.04 bytes/sec, 26.26 docs/sec

    indexing index 'test1stemmed'...

    FATAL: failed to open @CONFDIR@/data/test1stemmed.spl: No such file or directory, will not index. Try --rotate option.

    в чем проблема? И как выставить @CONFDIR@ ? Где она прописывается?

  10. adw0rd | 15.06.2009 в 16:13

    aktuba, бюджет зависит от кол-ва данных и структуры поиска, я еще не могу представить это, без малейшего ТЗ. Но я заинтересован :)

  11. smackthat | 15.06.2009 в 16:14

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

  12. aktuba | 15.06.2009 в 16:15

    adw0rd: постучи в аську, plz: 255261508

  13. adw0rd | 15.06.2009 в 16:17

    У меня аськи нет :( adw0rd.ru/contacts

    Если у тебя нет скайпа и жаббера, то могу в принципе восстановить аську

  14. aktuba | 15.06.2009 в 16:19

    Есть скайп: aktuba. Есть и куча жабберов, но я ими не пользуюсь. Можешь добавить aktuba@qip.ru, но не обещаю, что контакт сохранится =)

  15. adw0rd | 15.06.2009 в 16:28

    aktuba, добавил тебя в скайпе и в жаббер :)

  16. adw0rd | 15.06.2009 в 16:30

    smackthat, укажи полный путь до каталога «/data/», там хранятся индексы. У меня в конфиге написано как это делать, ты читал внимательно?

  17. smackthat | 15.06.2009 в 16:33

    шас еще раз прочту

  18. adw0rd | 15.06.2009 в 16:37

    smackthat, видео можно, сегодня попробую снять, но не обещаю :)

    Может при следующих выпусках сниму...

  19. smackthat | 15.06.2009 в 17:59

    разобрался, ищет через утилиту search. Вот осталось через php попробовать. А видео было б воопще клево!

  20. adw0rd | 15.06.2009 в 18:03

    >Вот осталось через php попробовать.

    ну попробуй по соей статье заюзать API :)

  21. smackthat | 15.06.2009 в 19:37

    в общем попробывал, но страничка зависает, непойму почему. Делаю так:

        function search($search)
        {

        // Подключаем sphinx-api (я использую CodeIgniter)
         $this->load->library('sphinx');

         $this->sphinx->SetArrayResult(TRUE);
         $result = $this->sphinx->Query($search);
         
         return $result;        
        }

    Просто как будто загружается, но ничего не происходит, что это может быть?

  22. smackthat | 15.06.2009 в 19:53

    также попробывал через обычный php, без фреймворка. Точно как у тебя в примере. таже ситуация — страничка подвисает. Проверил сервисы — SphinxSearch есть. Но при его ручном запуске выдает ошибку — Cant start service on local machine

  23. smackthat | 15.06.2009 в 19:56

    теперь запустил через консоль сам демон и оно выдало такое:

    This program (CLI search) is for testing and debugging purposes only;

    it is NOT intended for production use.

    C:\Program Files\sphinx\bin>searchd

    Sphinx 0.9.8-release (r1533)

    Copyright © 2001—2008, Andrew Aksyonoff

    WARNING: forcing --console mode on Windows

    using config file './sphinx.conf'...

    creating server socket on 127.0.0.1:3312

    accepting connections

    // в этом месте была значительная пауза

    caught SIGTERM, shutting down

    shutdown complete

  24. adw0rd | 15.06.2009 в 21:12

    Дай полностью свой конфиг

  25. smackthat | 15.06.2009 в 21:16

    #############################################################################
    ## data source definition
    #############################################################################

    source articles
    {
            # Параметры подключения к БД
            type = mysql
            sql_host = localhost
            sql_user = root
            sql_pass = *********
            sql_db = testdatabase
            sql_port = 3306

            # Установим кодировку для работы с БД
            sql_query_pre = SET NAMES utf8
            sql_query_pre = SET CHARACTER SET utf8

            # Запрос выборки данных для индексации
            sql_query = SELECT id, title, category, description, key_words, short_text, id_author FROM articles

            # Запрос доп. информации для вывода результата (используется утилитой "search")
            sql_query_info = SELECT * FROM articles WHERE `id` = $id

            # Время простоя (sleep) перед посылкой запросов серверу (предназначен для разгрузки сервера БД)
            # Если установите "= 1000", то засыпание будет длится 1 секунду
            sql_ranged_throttle = 0
    }



    #############################################################################
    ## index definition
    #############################################################################

    index articles
    {
            # Использовать соответствующий source-блок настроек при индексации
            source = articles

            # Путь до файлов индекса
            path = c:\Program Files\sphinx\bin\data\articles

            # Способ хранения индекса (none, inline, extern)
            # Подробнее http://www.sphinxsearch.com/docs/manual-0.9.8.html#conf-docinfo
            docinfo = extern

            # Memory lock (http://www.sphinxsearch.com/docs/manual-0.9.8.html#conf-mlock)
            mlock = 0

            # Использование английского и русского стемминга
            morphology = stem_enru

            # Минимальная длина индексируемого слова
            min_word_len = 2

            # Установка используемой кодировки
            charset_type = utf-8

            # Таблица символов (http://www.sphinxsearch.com/docs/manual-0.9.8.html#conf-charset-table)
            charset_table = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F

            # Минимальная длина инфикса (префикс в том числе)
            min_infix_len = 2

            # Использовать оператор усечения "*" (http://www.sphinxsearch.com/docs/manual-0.9.8.html#conf-enable-star)
            enable_star = 1
    }

    #############################################################################
    ## indexer settings
    #############################################################################

    indexer
    {

        mem_limit           = 32M

    }

    #############################################################################
    ## searchd settings
    #############################################################################

    searchd
    {
            # Адрес сервера
            address = 127.0.0.1

            # Порт
            port = 3312

            # Лог
            log = c:\Program Files\sphinx\log\searchd.log

            # Лог запросов
            query_log = c:\Program Files\sphinx\log\query.log

            # Таймаут на соединение с сервером (в секундах). При истечении времени происходит обрыв
            read_timeout = 5

            # Максимальное кол-во потомков от процесса
            max_children = 30

            # Путь до pid-файла
            pid_file = c:\Program Files\sphinx\log\searchd.pid

            # Максимальное кол-во результатов выдачи
            max_matches = 1000
    }


    # --eof--

  26. smackthat | 15.06.2009 в 21:19

    а это нормально что порты не совпадают?

    source articles

    {

    sql_port = 3306

    }

    searchd

    {

    port = 3312

    }

  27. adw0rd | 15.06.2009 в 21:27

    smackthat, первый порт — SQL, второй — Sphinx

  28. smackthat | 15.06.2009 в 21:36

    ясно. А в чем проблема не знаешь? В переменную Path добавил путь к папке bin, но не пашет.

  29. adw0rd | 15.06.2009 в 21:45

    > В переменную Path добавил путь к папке bin, но не пашет.

    Прописать патх нужно для вызова search, searchd, indexer, без прописывания полного пути...

    Сейчас посмотрю конфиг...

  30. smackthat | 15.06.2009 в 22:00

    >Прописать патх нужно для вызова search, searchd, indexer, без прописывания полного

    >пути...

    а вот оно что))) не силен я в этих консольных штуках...

    >Сейчас посмотрю конфиг...

    жду)))

  31. adw0rd | 15.06.2009 в 23:17

    smackthat, а ты создал каталог «c:\Program Files\sphinx\bin\data»?

  32. smackthat | 16.06.2009 в 01:01

    да, и после индексации в нем появились файлы articles с разными форматами sp*

  33. adw0rd | 16.06.2009 в 02:34

    smackthat, проверял работу SQL-запросов? Я просто протестил с твоими конфигами, все нормально!

    Ты так в точности запускаешь? Если нет, покажи как именно.

    # indexer --config c:\Program Files\sphinx\sphinx.conf --all
    # search –-config c:\Program Files\sphinx\sphinx.conf искомая комбинация
    # searchd –-config c:\Program Files\sphinx\sphinx.conf

  34. smackthat | 16.06.2009 в 12:12

    C:\Program Files\sphinx\bin>indexer --config "C:\Program Files\sphinx\sphinx.conf" --all
    Sphinx 0.9.8-release (r1533)
    Copyright (c) 2001-2008, Andrew Aksyonoff
    using config file 'C:\Program Files\sphinx\sphinx.conf'...
    indexing index 'articles'...
    collected 8 docs, 0.0 MB
    sorted 0.0 Mhits, 97.8% done
    total 8 docs, 9135 bytes
    total 0.949 sec, 9630.17 bytes/sec, 8.43 docs/sec

    C:\Program Files\sphinx\bin>search --config "C:\Program Files\sphinx\sphinx.conf" qip
    Sphinx 0.9.8-release (r1533)
    Copyright (c) 2001-2008, Andrew Aksyonoff
    using config file 'C:\Program Files\sphinx\sphinx.conf'...
    index 'articles': query 'qip ': returned 1 matches of 1 total in 0.000 sec
    displaying matches:
    1. document=82, weight=3
            id=82
            title=21 QIPxyZ ????????? ???? ??? ??????
            category=35
            type=1
            language=1
            description=QIP ????????? ???? ????
            key_words=qip, icq, internet, ?????, ?????
            short_text=? ????????? ??? ??????? ?????? ?? ??????? Mblogi (?????????? ?? QIP, ? ??????? ?? ????????? ??????????? ??????? ????????????? QIP Infium).

    и еще там текст, в общем ищет

    C:\Program Files\sphinx\bin>searchd --config "c:\Program Files\sphinx\sphinx.conf"
    Sphinx 0.9.8-release (r1533)
    Copyright (c) 2001-2008, Andrew Aksyonoff
    FATAL: malformed or unknown option near 'Ц-config'; use '-h' or '--help' to see available options.
    C:\Program Files\sphinx\bin>

    теперь другой результат, так как раньше конфиг был в папке bin. Что делать?

  35. adw0rd | 16.06.2009 в 14:49

    >FATAL: malformed or unknown option near 'Ц-config';

    Что за «Ц-config»? Чего там «Ц» делает?

    >теперь другой результат, так как раньше конфиг был в папке bin

    А причем тут папка «bin»?

  36. Snowcore | 16.06.2009 в 18:06

    adw0rd, так держать! Еще один замечательный программерско-админский пост!

  37. smackthat | 16.06.2009 в 18:30

    это просто случайно скопировал, считай что последней строки нет. А можно как-то деинсталировать сервис, а потом повторно установить?

  38. adw0rd | 16.06.2009 в 18:44

    smackthat,

    searchd --config c:\Webserver\usr\sphinx\sphinx.conf --stop

  39. adw0rd | 16.06.2009 в 18:44

    Snowcore, спасибо! :)

  40. smackthat | 16.06.2009 в 20:06

    при попытке остановить пишет что pid файл недоступен или нечитаем. Хотя я и создал каталог, в котором он должен быть. В чем проблема? Также создавал этот пид файл (просто новый пустой файл с этим названием) пишет, что невалидный пид файл. Где его брать? При попытке проинсталировать (--install) пишет что сервис уже запущен.

  41. adw0rd | 17.06.2009 в 01:59

    PID не надо создавать, у меня он вообще не создается. *.pid — это Файл, в который сохраняется PID-процесса.

  42. smackthat | 17.06.2009 в 20:55

    Спасибо за статью и пояснения я разобрался!

  43. adw0rd | 17.06.2009 в 21:45

    Ура! :)

  44. splash | 15.07.2009 в 15:10

    А что за ошибка при индексации — column '1' has no name ?

    Ошибка из-за строки

    sql_query = SELECT id as news_id, topic, date FROM news

    работает только если выбираем одно поле as его новое имя, типа

    sql_query = SELECT id as news_id FROM news

    Почему же не обрабатывает нормальный запрос?

  45. adw0rd | 15.07.2009 в 15:14

    splash, покажите source полнстью

  46. splash | 16.07.2009 в 15:55

    source adw0rd_wp
    {
            type = mysql
            sql_host = localhost
            sql_user = user
            sql_pass = pass
            sql_db = _mpc
            sql_port = 3306
            sql_query_pre = SET NAMES utf8
            sql_query_pre = SET CHARACTER SET utf8
            sql_query = SELECT id as news_id, topic, date FROM news
            sql_query_info = SELECT * FROM news WHERE id = $id
            sql_ranged_throttle = 0
    }

  47. adw0rd | 16.07.2009 в 16:01

    Какая версия sphinx и mysql у вас? Только точнее, пожалуйста.

  48. splash | 16.07.2009 в 16:10

    sphinx-0.9.8.1-win32

    mysql 5.1.31

    база в utf8

  49. adw0rd | 16.07.2009 в 16:16

    Думаю проблема с Win-версией, я под Windows не устанавливал Sphinx.

    Посмотрите sphinxsearch.com/forum/view.html?id=937

  50. splash | 16.07.2009 в 16:54

    Это я уже видел, но не могу найти библиотеку libmysql.dll от mysql 5.0.xx отдельно от дистриба общего...

  51. adw0rd | 16.07.2009 в 18:59

    dev.mysql.com/get/Downloa...ac.at/db/mysql/ разве тут вы не нашли?

  52. splash | 17.07.2009 в 10:35

    Слишком огромный архив выкачивать ради одной dll...

    Библиотеку нашёл, через exe всё работает, но при запуске через php выполняются следующие строки

    $string = $_POST['s'];// Искомая комбинация
    $sphinx = new SphinxClient();// Создаем объект клиента для Sphinx API
    $sphinx->SetServer('localhost', 3312);// Подсоединяемся к Sphinx-серверу
    $sphinx->SetMatchMode(SPH_MATCH_ANY);// Совпадение по любому слову
    $sphinx->SetSortMode(SPH_SORT_RELEVANCE);// Результаты сортировать по релевантности
    $sphinx->SetFieldWeights(array ('NAME' => 20, 'DESC_FULL' => 10));
    echo '1';
    $result = $sphinx->Query($string, '*');
    echo '2';

    на последней строке повисает минуты на 2 и без каких-либо ошибок и сообщений завершает работу, '1' выводится, '2' — нет.

    Может из-за той же библиотеки, подменяю libmysql.dll в папке mysql — ничего не меняется, может нужна php_mysql.dll от старой версии...

  53. adw0rd | 17.07.2009 в 10:46

    splash, у меня этот архив качается 2 минуты. Вот ваша библиотека: 1dfile.ru/get/2c5b91fca2c...d03/libmysql.dll

  54. adw0rd | 17.07.2009 в 10:47

    может нужна php_mysql.dll от старой версии...

    Вряд ли.
  55. splash | 17.07.2009 в 12:26

    Спасибо за ссылку, но у меня такая же dll.

    В общем всё решилось, глючил searchd, повисал при запуске, хотя висело окно с надписью ожидаю подключений... перегрузил всё что можно — заработало.

    И библиотека вообще не при чём, при поиске через php она не используется.

  56. adw0rd | 17.07.2009 в 12:34

    >И библиотека вообще не при чём, при поиске через php она не используется.

    mysql-php-api ее не юзает?

    Так теперь у вас все работает?

  57. splash | 17.07.2009 в 14:11

    Да, спасибо!

    Дело осталось за тестированием...

  58. Александр | 11.08.2009 в 15:26

    Объясните мне пожалуйста, что это за запросы???

    # Запрос выборки данных для индексации
            sql_query = SELECT ID as post_id, post_title, post_content FROM wp_posts WHERE post_type = 'post'

            # Запрос доп. информации для вывода результата (используется утилитой "search")
            sql_query_info = SELECT * FROM wp_posts WHERE ID = $id

    а точнее, что это за post откуда он его берет и что это за $id как оно туда приходит... откуда, допустим я хочу сделать запрос по «той же базе и настройках» как и тут

    запрос который я хочу сделать -> SELECT id, title, category FROM articles where title = 'хочу найти...'

    как я понимаю этот запрос нужно положить именно в конфиг сфинкса, а в то место 'хочу найти...' подставить переменную и когда я напишу что-то типа $result = $sphinx->Query ($string, '*'); оно подставит эту $string сюда -> 'хочу найти...' и вернет результат в id а дальше уже по мускулу подставляю те id и возвращаю то, что мне нужно... так как его туда подставить эту переменную $string именно сюда 'хочу найти...' вообщем на этом моменте я чет не догоню...

  59. adw0rd | 11.08.2009 в 15:33

    Александр, вы немного не правильно понимаете.

    sql_query = SELECT ID as post_id, post_title, post_content FROM wp_posts WHERE post_type = 'post'

    Это mysql-выборка, которая будет проиндексирована сфинксом, то есть те данные по которым он будет искать. «SELECT ID as post_id» — это будет ид для сфинкса и именно он используется в запросе:

    sql_query_info = SELECT * FROM wp_posts WHERE ID = $id

  60. Александр | 11.08.2009 в 16:24

    попытка номер два...

    # Запрос №1
            sql_query = SELECT id, title, category, description, key_words, short_text, id_author FROM articles

    # Запрос №2
            sql_query_info = SELECT * FROM articles WHERE `id` = $id

    первый запрос ничего не делает кроме того как извлекает ВСЕ данные с таблицы и сохраняет сюда его path = /home/sphinx/data/adw0rd_wp как индекс

    запрос номер два а именно $id и есть это $result = $sphinx->Query ($string, '*');

    т.е. $string подставляется в $id и он по полю `id` ищет ту строку $string?

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

  61. adw0rd | 11.08.2009 в 16:39

    # Запрос доп. информации для вывода результата (используется утилитой "search")
    sql_query_info = SELECT * FROM wp_posts WHERE ID = $id

    обратите внимание на коммент, «второй» запрос используется ТОЛЬКО утилитой search, а не API.

  62. adw0rd | 11.08.2009 в 16:51

    API только тянет иды, далее вы сами разруливаете что с ними делать, если хотите всетаки работать непосредственно в mysql, то почитайте мою статью о SphinxSE

  63. Snowcore | 05.10.2009 в 14:51

    У меня какая-то странная ошибка, когда пытаюсь запустить индексацию:

    ERROR: invalid token in C:\sphinx\sphinx.conf line 1 col 1.

    FATAL: failed to parse config file 'C:\sphinx\sphinx.conf'.

  64. adw0rd | 05.10.2009 в 15:59

    Snowcore, а, это ты :) Не узнал, но всеравно ответил в жаббер )

  65. Snowcore | 06.10.2009 в 15:10

    Еще хотелось бы увидеть пример подсветки результатов поиска, используя метод BuildExcerpts

  66. adw0rd | 06.10.2009 в 23:09

    Snowcore, в мане же отличный пример O_o

  67. Ульян | 26.10.2009 в 20:11

    Привет, никак не могу справиться с проблемой. При установке поиск работал прекрасно и первое индексирование прошло успешно. Сейчас переехали на новый сервер перенесли полностью всё, поиск работает, а вот запустить индексирование никак не удается. Не подскажете, в чём может быть дело?

    $ indexer --config /var/www/pro/config/sphinx.conf --all --rotate
    Sphinx 0.9.9-rc2 (r1785)

    using config file '/var/www/pro/config/sphinx.conf'...
    WARNING: key 'port' is deprecated in /var/www/pro/config/sphinx.conf line 343; use 'listen' instead.
    indexing index 'baseIndex'...
    ERROR: index 'baseIndex': no valid sources configured; skipping.
    indexing index 'news'...
    FATAL: failed to open /var/www/pro/tmp/searchindex/news.tmp.spl: No such file or directory, will not index. Try --rotate option.

  68. adw0rd | 27.10.2009 в 00:22

    В версии 0.9.9 поменялись конфиги, надо теперь не

    address = 192.168.0.1
    port = 3312

    а

    listen = 192.168.0.1:3312

    О чем вас и предупреждает SphinxSearch — «use 'listen' instead.»

  69. hellwarr | 14.11.2009 в 11:50

    А такой вопрос есть ли возможность прикрутить поисковичек сфинкс к торрент трекеру??

    Если да то не подскажеш как, а тот тот поисковичек который идет в «комплекте» гадость редкосная.

  70. adw0rd | 14.11.2009 в 14:13

    Можно, индексируете данные, выводите результаты. В чем конкретно проблема? В каком виде данные по которым осуществляется поиск?

  71. ingvar | 17.11.2009 в 17:49

    Спасибо за статью! Все настроил, работает.

    adw0rd: А возможно выводить результат напрямую из Sphinx, а не делая доп. запрос к мускулю, ведь в консоли мы получаем эти данные, а при посте формы нет.

  72. adw0rd | 17.11.2009 в 18:01

    ingvar, sphinx использует эти данные только для поиска по ним. Вы не можете их использовать в качестве результата, а то что вы их видите в консоли это тоже результаты из mysql

    Посмотрите внимательно свой конфиг:

            # Запрос доп. информации для вывода результата (используется утилитой "search")
            sql_query_info = SELECT * FROM wp_posts WHERE ID = $id

  73. ingvar | 17.11.2009 в 18:08

    Теперь все ясно. А Морфология, для неё разве не нужны словари? У sphinx я не увидел их.

  74. adw0rd | 17.11.2009 в 18:43

    Обратите внимание на конфиг, там есть:

            # Использование английского и русского стемминга
            morphology = stem_enru

    Подробнее: sphinxsearch.com/docs/man...#conf-morphology

  75. hellwarr | 20.11.2009 в 09:14

    А как можно прикрутить его на CentOS 5.4, и сделать так чтобы он индексировал и искал если написал не кирилицеа а аглийским(розкладку не выключил)?

    Если да то можно узнать личными заказами занимаешся???))

  76. hellwarr | 20.11.2009 в 09:15

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

  77. hellwarr | 20.11.2009 в 09:20

    и торрент он точно сможет проиндексировать??? а то пробовали через другие поисковички так оно только ихенею выдавало

  78. adw0rd | 20.11.2009 в 10:48

    А как можно прикрутить его на CentOS 5.4

    А какие проблемы?

    и сделать так чтобы он индексировал и искал если написал не кирилицеа а аглийским(розкладку не выключил)?

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

    Если да то можно узнать личными заказами занимаешся???))

    Уже нет, времени нет.

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

    нет, есть консоль

    и торрент он точно сможет проиндексировать??? а то пробовали через другие поисковички так оно только ихенею выдавало

    что подразумевается под индексированием торрента?

  79. hellwarr | 23.11.2009 в 23:50

    Хочу сделать поисковик по страницам своего торрента. Стандартный немного не устраивает

  80. adw0rd | 24.11.2009 в 09:58

    hellwarr, ясно, вам надо не по торрентам искать, а по вашему сайту... Я не работал с готовыми движками для торрент-трекеров, мы только свой разрабатывали с нуля kinsburg.ru

  81. alpha_Qu4z4r | 06.12.2009 в 11:56

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

  82. adw0rd | 07.12.2009 в 09:46

    1. Написать паука

    2. Индексатором обработать инфу

    Хотя статью можно накатать...

  83. alpha_Qu4z4r | 07.12.2009 в 11:59

    О какм пауке речь?

    Статью обязательно надо. Ибо не у всех все сайты на одном хосте, может и не ко всем есть доступ, а я для локалки поисковик решил сделать. Тамошние сайты не все доступны из интернета и не у всех пользователей есть инет(как ни удивительно).

  84. adw0rd | 07.12.2009 в 13:40

    О какм пауке речь?

    Речь о пауке, написанном на каком-либо языке программирования, занимающимся тем, что ходит по заданным сайтам и собирает информацию с них.
  85. alpha_Qu4z4r | 07.12.2009 в 18:57

    Тоесть ты говоришь об индексаторе? А что, в нормальный пакет не должна включаться хоть какая-то реализация под несколько наборов задач?

    В том же яндекс.сервере всё в один пакет собрано и индексатор, и поисковик, и даже веб сервер =)

  86. adw0rd | 07.12.2009 в 23:06

    alpha_Qu4z4r,

    1. Я говорю о поисковом пауке, индексатор это другое.

    2. Sphinx — FTS движок. Никакого отношения к сбору данных он не должен иметь.

    3. Я не знаю есть ли для Sphinx готовые реализации поискового паука, и меня это не интересовало до этого времени. Но если бы мне понадобился паук, то я бы его сам написал.

  87. alpha_Qu4z4r | 08.12.2009 в 20:33

    Понятно, значит яндек.сервер для такой задачи подходит как никто другой... А я надеялся на альтернативы не в виде кубика-рубика =)

  88. heretique | 11.12.2009 в 14:02

    Подскажите, пожалуйста, конфиг для индексации одной файловой директории и нескольких БД (под управлением Interbase).

  89. adw0rd | 11.12.2009 в 14:33

    Я не знаю, посмотри оф. документацию

  90. dali | 14.12.2009 в 08:03

    ERROR: invalid token in C:\sphinx\sphinx.conf line 1 col 1.

    FATAL: failed to parse config file 'C:\sphinx\sphinx.conf'.

    У меня тоже такая ошибка, подскажите в чем дело, плиз

  91. adw0rd | 14.12.2009 в 09:54

    Какая кодировка файла? Случайно не UTF8?

    И что у вас на первой строке файла? (всю строку)

  92. dali | 14.12.2009 в 14:22

    Спасибо, я уже разобрался. Редактор сохранял файл save with bom. сохранил без, все заработало.

    Спасибо большое за статью

  93. adw0rd | 14.12.2009 в 16:08

    Ага, и я об этом :)

  94. Ad1ce | 18.12.2009 в 02:03

    Мне нужен простейший поиск по коротким статьям. На данный момент при помощи match against время поиска 0,17-2 сек, но надо быстрее. Сфинкс в данном вопросе поможет?

  95. adw0rd | 18.12.2009 в 10:04

    Да, уверен что поможет

  96. Ad1ce | 19.12.2009 в 02:28

    В принципе помогло, ищет моментально, но возникла старая непобежденная проблема:

    сфинкс возвращает айдишники, далее эти айдишники я ищу в базе, и получаю те же самые 0,25 сек.

    Или же, в данном случае сфинкс не причем, запрос вида select * from table limit 85300,30 может выполняться до 10 сек.

    Как это побороть?

  97. adw0rd | 19.12.2009 в 11:59

    сфинкс конечно не причем, он вам нашел результаты быстро, на этом его миссия окончена. А далее, как вы производите выборку средствами mysql — отдельный вопрос. Кстати, вы юзаете Sphinx API, SphinxSE или SphinxQL?

  98. Ad1ce | 19.12.2009 в 14:02

    Конечно же не причем, «или же» — это ссылка на другую ситуацию.

    Юзаю через апи. sphinxql не заработал.

    А вот что нашел по моей проблеме:

    Но если количество записей велико, и нужно выполнить запрос

    SELECT ... FROM table LIMIT 1000000, 1000020

    то для выполнения такого запроса MySQL сначала выберет 1000020 записей, отбросит первый миллион и вернет 20. Это может быть вовсе не быстро. Тривиальных путей решения проблемы нет. Многие просто ограничивают количество доступных страниц разумным числом. Также можно ускорить подобные запросы использованием покрывающих индексов или сторонних решений (например, sphinx).

  99. adw0rd | 19.12.2009 в 15:08

    Я немного не понял, вы сфинкс юзаете для поиска или для выборки?

    Если речь о таком запросе:

    SELECT ... FROM table LIMIT 1000000, 1000020

    то я бы сделал так:

    SELECT ... FROM table WHERE id > 1000000 and id < 1000020

    Что-то в этом духе, можно еще что-то придумать...

    habrahabr.ru/blogs/mysql/76861/ вот почитайте по поводу MySQL

  100. Ad1ce | 19.12.2009 в 15:32

    Да. Этот пример видел. Тут сложность у меня с внедрением, так как limit идет из сложного условия из нескольких таблиц, то надо сделать несколько запросов, чтобы узнать id'ки. А далее придется сделать на выборку where id in ().

    Если в сфинксе создать несколько идексов, то как можно обратиться к конкретному из php api?

  101. Ad1ce | 19.12.2009 в 15:34

    Если такое вообще возмножно

  102. adw0rd | 20.12.2009 в 12:21

        // Результат по запросу (* - использование всех индексов)
        $result = $sphinx->Query($string, '*');

    Вместо «*» поставьте свой индекс.

  103. Ad1ce | 21.12.2009 в 02:57

    Спасибо. Теперь мне стала понятна структура конф файлов и для чего там столько разделов.

  104. Димко | 28.12.2009 в 21:34

    adw0rd, установил sphinx с помощь вашей статьи.

    Делаю поиск в консоли (слово 'test' в базе есть).

    #

    search test
    Sphinx 0.9.9-release (r2117)
    Copyright (c) 2001-2009, Andrew Aksyonoff

    using config file '/usr/local/etc/sphinx.conf'...
    index 'tovar': query 'test ': returned 1 matches of 1 total in 0.000 sec

    displaying matches:
    1. document=8, weight=1
            id=8
            id_autor=1
            id_firm=102249
            id_catalog=87101
            odobr=1
            name=
            opis=test
            price=
            date_create=0

    words:
    1. 'test': 1 documents, 1 hits

    Но из php не работает

    require_once '/usr/local/etc/sphinx/sphinx/api/sphinxapi.php';
       $client = new SphinxClient();

       $client->SetLimits(1,10);
       $client->SetArrayResult(true);
       $result = $client->Query('test','*');
       echo '<pre>';
       print_r($result);
       echo '</pre>';

  105. adw0rd | 29.12.2009 в 11:03

    А где?

        // Подсоединяемся к Sphinx-серверу
        $sphinx->SetServer('localhost', 3312);

  106. Димко | 29.12.2009 в 14:21

    Эта строчка была, потом я ее убрал. Все варианты попробовал. Не работает и не могу понять в чем причина.

     <?php


      include "/usr/local/etc/sphinx/sphinx/api/sphinxapi.php";
      $cl = new SphinxClient();
      $cl->SetServer('localhost', 3312);
      $cl->SetMatchMode(SPH_MATCH_EXTENDED2);
      $results = $cl->Query('test', 'tovar');
      print_r($results);

      ?>


       </body>
       </html>

  107. adw0rd | 30.12.2009 в 00:39

    Дайте адрес сервера, где у вас установлен сфинкс, я проверю.

    Вот мои контакты если что adw0rd.ru/contacts/

    зы. Вы searchd то подняли? Утилита search не использует этот демон, а API использует.

  108. Димко | 30.12.2009 в 00:59

    searchd я запускал перед использованием в php, скинул root вам на почту.

  109. adw0rd | 30.12.2009 в 11:50

    Был неверно указан порт, надо:

    $cl->SetServer('localhost', 9312);

  110. Димко | 31.12.2009 в 01:24

    Благодарствую за помощь!. Действительно работает.

    С наступающим Новым Годом! Всего наилучшего!

  111. Ad1ce | 02.01.2010 в 13:21

    Не подскажете как сделать индекс по точному вхождению фразы. К примеру если категория называется «очень большие грузовики», то она не должна найтись по слову «очень» или «грузовики».

    т.е. надо чтобы сфинкс также учитывал пробелы.

  112. olegre | 04.01.2010 в 03:25

    по английски ищет а по русски не хочет

    Вот мой конфиг

    source zizl
    {
            type = mysql
            sql_host = localhost
            sql_user = root
            sql_pass =
            sql_db = zizl
            sql_port = 3306

            sql_query_pre = SET NAMES utf8
            sql_query_pre = SET CHARACTER SET utf8

            sql_query = SELECT m.id_message, m.rendered, u.username FROM messages m LEFT JOIN users u ON m.id_user = u.id_user

            sql_query_info = SELECT * FROM messages WHERE `id_message` = $id
            sql_ranged_throttle = 0
    }

    index message
    {
            source = zizl
            path = S:/sphinx/index/message
            docinfo = extern
            mlock = 0
            morphology = stem_enru
            min_word_len = 2
            charset_type = sbcs
            #charset_table = 0..9, A..Z->a..z, _, a..z, U+A8->U+B8, U+B8, U+C0..U+DF->U+E0..U+FF, U+E0..U+FF
            charset_table = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F
            min_infix_len = 2
            enable_star = 1
    }

    indexer
    {
            mem_limit = 32M
    }

    searchd
    {
            address = 127.0.0.1
            port = 3312
            log = S:/sphinx/log/searchd.log
            query_log = S:/sphinx/log/query.log
            read_timeout = 5
            max_children = 30
            pid_file = S:/sphinx/log/searchd.pid
            max_matches = 1000

    }

  113. adw0rd | 04.01.2010 в 12:28

    olegre,

    charset_type = sbcs

    это что за кодировка?

            sql_query_pre = SET NAMES utf8
            sql_query_pre = SET CHARACTER SET utf8

    а тут вы юзаете utf-8

    Понимаете в чем смысл?

  114. adw0rd | 04.01.2010 в 12:30

    Ad1ce, хороший вопрос, сам не знаю... но дело не в индексе, а в самом поиске. Попробуйте поменять match_mode (all, any, both, ext...)

  115. olegre | 04.01.2010 в 18:27

    adw0rd,

    кодировку я поменял, но проблема осталась.

    S:\sphinx\bin>search дело
    Sphinx 0.9.8-release (r1533)
    Copyright (c) 2001-2008, Andrew Aksyonoff

    using config file './sphinx.conf'...
    index 'message': query 'фхыю ': returned 0 matches of 0 total in 0.000 sec

    words:

    обратите внемание на кодировку вместо 'дело' написано 'фхыю '

  116. adw0rd | 05.01.2010 в 21:25

    Вы в Windows-консоли это все пишете? Так у вас кодировка будет cp866 скорее всего, а не utf8, погуглите на тему как установить в консоле кодировку utf8

  117. Shuranov | 06.01.2010 в 14:35

    Настраиваю поиск, но также столкнулся с проблемой поиска по кириллице.

    Структура таблицы новостей:

    CREATE TABLE IF NOT EXISTS `News` (
      `id` int(12) unsigned NOT NULL auto_increment,
      `title` varchar(255) NOT NULL,
      `text` text NOT NULL,
      `publish` datetime NOT NULL,
      `f_year` int(4) NOT NULL,
      `f_month` int(2) NOT NULL,
      `f_day` int(2) NOT NULL,
      `url` varchar(255) NOT NULL,
      `member_id` int(12) NOT NULL,
      PRIMARY KEY  (`id`),
      KEY `publish` (`publish`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=119798 ;

    Конфигурация Sphinx:

    source news
    {
            type = mysql
            sql_host = localhost
            sql_user = user
            sql_pass = password
            sql_db = database
            sql_port = 3306

            sql_query_pre = SET CHARACTER_SET_RESULTS=utf8
            sql_query_pre = SET NAMES utf8
            sql_query_pre = SET CHARACTER SET utf8

            sql_query = SELECT id `news_id`, title `news_title`, text `news_text` FROM News
            sql_query_info = SELECT * FROM News WHERE id = $id
            sql_ranged_throttle = 0
    }

    index news
    {
            source = news
            path = /path/to/index/news
            docinfo = extern
            mlock = 0
            morphology = stem_enru
            min_word_len = 2
            charset_type = utf-8
            charset_table = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F
            min_infix_len = 2
            enable_star = 1
            html_strip = 1
    }

    Индексация проходит нормально, без ошибок. Работаю в bash, кодировка utf8. Поиск по английскому слову хорошо работает, по русским словам, к

    оторые присутствуют в базе неоднократно, возвращает нулевой результат:

    #~/some/directory> search --config sphinx.conf лукас награда

    Sphinx 0.9.8.1-release (r1533)

    Copyright © 2001—2008, Andrew Aksyonoff

    using config file './sphinx.conf'...

    index 'news': query 'лукас награда ': returned 0 matches of 0 total in 0.000 sec

    words:

    1. 'лукас': 0 documents, 0 hits

    2. 'наград': 0 documents, 0 hits

    В какую сторону копать с кодировками?

  118. Shuranov | 07.01.2010 в 00:23

    Все, разрешил проблему сам, но все равно спасибо.

  119. Димко | 11.01.2010 в 14:00

    Вот что смущает в примере Sphinx API для PHP

      // Результат по запросу (* - использование всех индексов)
        $result = $sphinx->Query($string, '*');
       
        // Если есть результаты поиска, то
        if ($result && isset($result['matches']))
        {

            // Соединяемся с БД
            mysql_connect('localhost', 'user', 'password');
            mysql_select_db('adw0rd_wp');

    По сути производиться подключение к mysql, затем выборка

    $sql = '
                SELECT `ID`, `post_title`, `post_content`
                    FROM `wp_posts`
                    WHERE `ID` IN ('.$id_list.')
                    ORDER BY FIELD(`ID`, '.$id_list.')';

            $resource = mysql_query($sql);

    В чем тогда смысл sphinx? Или я что-то не так понял?

  120. adw0rd | 11.01.2010 в 14:47

    Сфинкс быстро находит ключи, оооооочччень быстро, никакой mysql вам не даст такого качественного и быстрого полнотекстового поиска.

    А если вас смущает использование API, то милости прошу: Sphinx SE и SphinxQL

  121. Димко | 11.01.2010 в 15:34

    Понятно, я просто думал что $result = $sphinx->Query ($string, '*'); уже содержит результат.

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

    И еще такой вопрос а быть может sphinx и не так хорош, ведь yandex server

    и postgeeSQL имеют словари, а не стемминг. Yandex server стоит на многих нагруженных проектах, http://company.yandex.ru/technology/server/clients/

  122. Димко | 11.01.2010 в 17:14

    adw0rd, у меня поиск возращает только 20 результатов (а если в phpmyadmin искать их гораздо больше), нигде в запросе LIMITS не писал. В чем может быть дело?

  123. adw0rd | 11.01.2010 в 17:22

    По умолчанию limit = 20, указывайте явно limit. И еще посмотрите сколько у вас выставлен в конфиге maxmatches.

  124. Димко | 11.01.2010 в 17:23

    maxmatches=1000

    а limit в какую секцию писать?

  125. adw0rd | 11.01.2010 в 17:24

    Мне Яндекс.Сервер не понравился по ряду причин: громозкий, непредсказуемый, менее быстрый... короче мне он не понравился...

    Sphinx — это удобная утилита. А Я.С — неудобный комбайн. Это мое ИМХО.

  126. adw0rd | 11.01.2010 в 17:26

    $sphinx->SetLimits(0,1000);

    www.sphinxsearch.com/docs...i-func-setlimits

  127. Dexel | 17.02.2010 в 02:01

    Для выборки ключей sphinx, а для выборки значений mysql?

    Человек задал вопрос. Присоединяюсь.

  128. Dexel | 17.02.2010 в 02:07

    И зачем тогда это в конфиге:

    sql_query_info = SELECT * from content WHERE r1.id=$id

  129. adw0rd | 17.02.2010 в 10:00

    Человек задал вопрос. Присоединяюсь.

    Да, сфинкс для ключей, а где значение хранится ему всеравно. Поэтому надо тянуть с БД.

    И зачем тогда это в конфиге:

    sql_query_info = SELECT * from content WHERE r1.id=$id

    Я это уже объяснил в посте:

    # Запрос доп. информации для вывода результата (используется утилитой «search»)

  130. Димко | 17.02.2010 в 13:14

    adw0rd, бьюсь на вопросом, может вы подскажите, как сделать выделение найденого фрагмента, т.е. например,

    я сделал запрос «продажа зерновых», а как мне отобразить слова справа и слева от запроса, т.е.

    ""«...Мы предлагаем ягромию, занимаемся оптовай „продажей зерновых“ культур...»""

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

  131. Dexel | 18.02.2010 в 13:33

    В Postgres-8.3 для этого есть функция ts_headline.

    Ну и если исходим из того, что Свинкс только для выдачи ключей, то выдачу с подсветкой, на уровне БД сделаю примерно так:

    select c.id,

    ts_headline('russian', title, q) as title,

    ts_headline('russian',descript,q) as descript,

    FROM content AS c, to_tsquery ('искомая фраза, которую загнали в Сфинкс') q

    WHERE c.id=$ключ_полученный_от_сфинкс

    adw0rd, Разжуй пожалуйста, как юзать штеммер из SphinxClient ?

  132. Димко | 18.02.2010 в 20:40

    Разобрался. Есть в сфинксе функция BuildExcerpts

    На примере моего запроса (индексация полей в 2-х таблицах)

    $sql = 'SELECT ws_cms_pub_firm.ID as ID, ws_cms_pub_firm.name as name, ws_cms_pub_firm.opis as opis, ws_cms_price_tab.opis as propisln, ws_cms_pub_firm.mail as mail, ws_cms_pub_firm.site as site, ws_cms_pub_firm.city as city FROM ws_cms_pub_firm, ws_cms_price_tab
      WHERE ws_cms_pub_firm.ID IN ('.$id_list.') AND ws_cms_price_tab.id_firm = ws_cms_pub_firm.id GROUP BY ws_cms_pub_firm.ID';
           $resource = mysql_query($sql);

    $opts = array

    (

    'before_match' => '',

    'after_match' => '',

    'chunk_separator' => ' ... ',

    'limit' => 120,

    'around' => 3,

    );

    while ($result = mysql_fetch_assoc ($resource))

    {

    $stroka = $cl->BuildExcerpts (Array ($result['opis'], $result['propisln']), «tovar», $str, $opts);

    echo $stroka[0];

    }

    где

    Array ($result['opis'], $result['propisln']) — массив индексируемых текстов

    tovar — индекс

    $str — исходная строка для поиска

    $opts — опции.

    Только теперь проблема, как результат выводить, содержащийся в массиве $stroka.

    К примеру $stroka[0] даст один из текстов, который не обзязательно содеражит поисковый запрос, т.к. он содержится например в $stroka[8].

  133. Dexel | 23.02.2010 в 14:53

    В выданном сфинксом массиве, там где matches, fields... есть массив:

    'words' =>

    array

    'слово1' =>

    array

    'docs' => int 7

    'hits' => int 8

    'слово2' =>

    array

    'docs' => int 10

    'hits' => int 16

    ...

    Вопрос: Как установить кол-во элементов, выдаваемых этим массивом, array['words'] который?

    У меня 10. Нужно 20. Плиз подскажите.

  134. adw0rd | 23.02.2010 в 15:00

    Почитайте о setLimits/maxMatches

  135. Димко | 24.02.2010 в 14:24

    Посмотрите, пожалуйста мой вопрос про BuildExcerpts.

    Т.е.

    $stroka = $cl->BuildExcerpts (Array ($result['opis'], $result['propisln']), «tovar», $str, $opts);

    является общим массивом полей $result['opis'], $result['propisln'] и как отобразить результат непонятно, т.к. у одной записи он может содержаться в переменной $stroka[0], в другой $stroka[1].

  136. Dexel | 24.02.2010 в 18:07

    setLimits задаёт колл-во в массиве 'matches'. В 'matches' у меня куча значений, которые меня не интересуют. Нужен массив 'words'. Повторю вопрос.

    Как установить колличество элементов в массиве 'words', а не в 'matches' ?

  137. adw0rd | 24.02.2010 в 18:20

    Димко, Dexel, извините, но я НЕ пользуюсь SphinxApi, я использую исключительно SphinxSE, поэтому максимум могу порекомендовать почитать оф. документацию.

  138. rostislav | 04.03.2010 в 19:56

    Не подскажите, можно ли через SphinxQL получить не только айдищникик, а все данные которые указаны в sql_query, чтоб не надо было потом из базы уже нчиего доставть?

    у меня всё время возвращает только id, weight и поле из sql_attr_uint

    Например

    SELECT * FROM product WHERE MATCH ('@name HANGSLOT');
    +---------+--------+----------------+
    | id      | weight | data_source_id |
    +---------+--------+----------------+
    | 1397621 |   1591 |              3 |
    | 1397624 |   1591 |              3 |
    | 1397625 |   1591 |              3 |
    | 1397626 |   1591 |              3 |
    | 1397627 |   1591 |              3 |
    | 1397628 |   1591 |              3 |
    | 1397631 |   1591 |              3 |
    | 1397632 |   1591 |              3 |
    | 1397633 |   1591 |              3 |
    | 1397634 |   1591 |              3 |
    | 1397635 |   1591 |              3 |
    | 1397638 |   1591 |              3 |
    | 1397639 |   1591 |              3 |
    | 1397640 |   1591 |              3 |
    | 1397938 |   1591 |              3 |
    | 1397942 |   1591 |              3 |
    | 1397948 |   1591 |              3 |
    | 1397949 |   1591 |              3 |
    | 1397950 |   1591 |              3 |
    | 1398295 |   1591 |              3 |
    +---------+--------+----------------+

  139. adw0rd | 05.03.2010 в 09:49

    rostislav, насколько я знаю нельзя, придется жойниться с данными

  140. Миха | 14.03.2010 в 18:18

    adw0rd, не пойму как его установить на w7 ? ваши команды с начала поста не работают в cmd строке... можете дать сылку на дистрибутив движка, который вы устанавливали,а то я вижу пути по папкам у нас отличаются

  141. adw0rd | 14.03.2010 в 20:38

    Какие команды? Опишите последовательность ваших действий.

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

    sphinxsearch.com/downloads.html скачивал тут. что именно не помню

  142. Elvis | 16.03.2010 в 18:23

    Вы конечно все классные и умные ребята !!!! но блин какого вы все «юзаете» да это же кошмар!!!!!!!!!!!!!!!!!!!!!! тошнит от этих словечек сленговых!!!! есть такое красивое слово в русском языке — «использую» , «пользуюсь» и т.д!!!!

  143. adw0rd | 16.03.2010 в 18:35

    Elvis, ну кого от чего тошнит... Меня например часто тошнит от огромного количества восклицательных знаков ;)

  144. Дмитрий | 16.03.2010 в 23:42

    adw0rd, спасибо за пост. Пригодилась. Поиск получился вполне приличный.

  145. rostislav | 17.03.2010 в 12:09

    Подскажитей пожалуйста как выполнить через через SphinxQL запрос с COUNT

    Всё время получаю ошибку

    mysql> SELECT COUNT (*) FROM product WHERE data_source_id=3;

    ERROR 1064 (42000): syntax error, unexpected '*', expecting TOK_DISTINCT near '*'

    если делать

    SELECT COUNT (DISTINCT @id) FROM product WHERE data_source_id=3;

    то возвращает не число а список записей

  146. adw0rd | 17.03.2010 в 12:18

    а так?

    COUNT(1)

  147. rostislav | 17.03.2010 в 12:31

    тоже на работает... :(

  148. adw0rd | 17.03.2010 в 12:55

    А вот так?

    SELECT @count FROM product WHERE data_source_id=3;

    У меня нет возможности проверить синтаксис к сожалению

  149. rostislav | 18.03.2010 в 15:03

    так тоже не работает :(

  150. Elvis | 18.03.2010 в 16:13

    rostislav —

    ну если звездочка не нравиться попробуй просто select count (id) from ...... есть же наверно какой то идентификатор у тебя ?

  151. Женек | 30.04.2010 в 14:07

    Здравствуйте!

    Скажите, пожалуйста, как ускорить работу сфинкса?

    Есть база, состоящая из 10000 документов. Каждый документ представляет собой статью размером 100-150 кбайт текста.

    Так вот, поиск по этой базе по запросу, состоящему из 5-8 слов, занимает примерно 1-1,5 секунды. Это очень долго. Можно ли как то ускорить поиск?

  152. adw0rd | 30.04.2010 в 15:20

    1. Как именно вы его используете? SphinxAPI/SE/QL?

    2. С какими настройками производите поиск? Сортировки/Релевантность?

    3. Какие характеристики у машины на которой работает searchd?

    4. Можно от вас получить лог запросов и время выполнения?

  153. Женек | 30.04.2010 в 15:55

    1. Использую Sphinx API. При использовании SphinxQL время поиска сокращается приблизительно до 0,5 секунды.

    2. Сортировка по релевантности.

    3. Intel Celeron 633 MHz. 384 МБайта памяти. Ось FreeBSD 7.2.

    4. Кусок лога:

    [Fri Apr 30 10:59:51.713 2010] 1.027 sec [any/0/rel 9604 (0,20)] [*] Анализ эффективности использования основных производственных фондов

    [Fri Apr 30 11:00:13.457 2010] 0.190 sec [any/0/rel 8330 (0,20)] [*] Статистические ряды динамики

    [Fri Apr 30 11:00:45.072 2010] 0.495 sec [any/0/rel 9428 (0,20)] [*] Экономико- статистический анализ размеров и уровня оплаты труда

    [Fri Apr 30 11:04:14.012 2010] 0.256 sec [any/0/rel 9459 (0,5)] [*] Виды ценных бумаг

    [Fri Apr 30 11:04:45.225 2010] 2.156 sec [any/0/rel 9717 (0,5)] [*] Актуальные проблемы возмещения налога на добавленную стоимость при экспорте товаров за пределы РФ

    [Fri Apr 30 11:05:16.173 2010] 1.380 sec [any/0/rel 9719 (0,5)] [*] Зоогигиеническая, санитарно-экологическая оценка молочно-товарной фермы на 200 коров племзавода ФГУП Чистые пруды Кировской области

    [Fri Apr 30 11:12:47.474 2010] 0.779 sec [any/0/rel 9719 (0,5)] [*] Зоогигиеническая, санитарно-экологическая оценка молочно-товарной фермы на 200 коров племзавода ФГУП Чистые пруды Кировской области

    [Fri Apr 30 11:15:03.590 2010] 0.698 sec [any/0/rel 9716 (0,5)] [*] Виды и особенности антропогенных воздействий на природу

    [Fri Apr 30 11:15:32.093 2010] 1.192 sec [any/0/rel 9707 (0,5)] [*] Проектирование участка дефектации Авторемонтного предприятия и разработка технологического процесса по устранению дефектов штока КПП КАМАЗ

    [Fri Apr 30 11:21:51.051 2010] 0.905 sec [any/0/rel 9704 (0,5)] [*] Гарантии прав профсоюзных объединений при осуществлении ими своих функций

    [Fri Apr 30 11:38:59.821 2010] 1.399 sec [any/0/rel 9703 (0,5)] [*] Правовой режим земель промышленности, энергетики, транспорта, связи,радиовещания, телевидения, земли для обеспечения космической деятельности,земли обороны, безопасности

    [Fri Apr 30 13:09:32.806 2010] 0.825 sec [any/0/rel 9689 (0,20)] [*] Словообразовательная активность наименований живых существ и их организмов в современном английском языке

    [Fri Apr 30 13:44:18.078 2010] 0.708 sec [any/0/rel 9682 (0,5)] [*] Восприятие внешней и внутренней среды рецепторами или рецепция. Классификация рецепторов, рецепции и анализаторов

  154. adw0rd | 30.04.2010 в 20:11

    1. На всех MATCH_MODE так себя ведет?

    2. А если не сортировать вообще?

    Еще посмотрите sphinxsearch.com/blog/

    Мне бы ваш индекс, я бы дома потестил. Кстати, а какая у вас версия Sphinx?

  155. Женек | 01.05.2010 в 10:39

    1. Я пробовал только на SPH_MATCH_ANY.

    2. Попробую отпишусь.

    Индекс порядка 700 метров занимает. 10000 документов индексировал около 3 часов...

  156. Женек | 01.05.2010 в 11:44

    Еще хотел спросить, а может ли сфинкс держать весь свой индекс в оперативной памяти, и если да, то поможет ли это ускорить поиск?

  157. reys | 11.05.2010 в 17:36

    Добрый день.

    Столкнулся с такой проблемой:необходимо проиндексировать поле таблицы

    varbinary (max). Внутри хрянятся html документы довольно большого размера(>8000 байт).

    в конфиге: sql_query =\

    Select id, doctype, CAST (doc AS varchar (max)) from Table2

    Sphinx 0.9.9 (r2117) MSSQL

    Проблема в том, что в этом случаем индексация идет только по первым 1024 символам документа. Если использовать CAST (doc AS varchar (8000), то по 8000 символов.

    Ссылка на форум, где подробнее описана эта проблема

    Там написано, что «перекомпилировать сфинкс, изменив константу размера поля по умолчанию».

    Что для этого необходимо сделать?)

    Заранее спасибо)

  158. adw0rd | 11.05.2010 в 19:55

    А doc какого типа в таблице?

    Попробуйте

    CAST (doc AS CHAR)

    , может поможет

  159. reys | 11.05.2010 в 21:44

    adw0rd, CAST (doc AS CHAR) так не помогло...

    doc — varbinary (max).

  160. adw0rd | 12.05.2010 в 12:10

    Может стоит сменить тип у doc на TEXT? Просто у меня например проблем не было с TEXT, гораздо большего размера чем 8кб

  161. reys | 12.05.2010 в 12:33

    К сожалению, менять тип поля нельзя...

    Есть готовая база на 20 Гб, в которой необходимо организовать поиск.

  162. reys | 13.05.2010 в 22:41

    Я вообще правельно понимаю, что перед индексацией данных в формате varbinary необходимо преобразовать их, например, в varchar? Или можно как-то иначе?

  163. Андрей | 21.05.2010 в 20:35

    Не получается с установкой под Линукс.

    1. Вообще сервис встал нормально без ошибок после make и make install

    2. Файлы расположены так на сервере

    /usr/local/bin — тут все службы indexer, search, searchd

    /usr/local/etc/test — файлы индексации, которые генерирует Sphinx

    Проблемы:

    1. Команда «indexer --config /usr/local/bin/sphinx.conf --all» Срабатывает, выдает статистику (без каких либо ошибок), но файты в папке /usr/local/etc/test не появляются.

    2. Команды search и searchd не срабатывают в ответ Command not found

    До этого поставил у себя сборку Windows локально. Так все отлично работает. А с этим Линуксом теперь даже и не знаю. Подскажите, пожалуйста.

  164. Андрей | 21.05.2010 в 20:53

    Хм... Переустановил с начала и все запахало. Чудеса.

  165. adw0rd | 21.05.2010 в 23:02

    Может прав не было на запись в каталог?

    Ну а команды не доступны навеное в силу того, что не перехешировались имена... надо было наверное полный путь до них. Но если из вообще не было, то что-то явно не так вставало :) так что переустановка — самое то

Оставить комментарий