Sphinx search mysql php

Saved searches

Use saved searches to filter your results more quickly

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.

PHP Sphinx search tool (An external solution for database fulltext search). Support Sphinx Api & SphinxQL.

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Sign In Required

Please sign in to use Codespaces.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

README.md

PHP Sphinx search tool (An external solution for database full-text search). Support Composer & Laravel Framework.

The PHP Sphinx Search Service Provider can be installed via Composer by requiring the euclid1990/php-sphinx-search package in your project’s composer.json .

< "require": < "euclid1990/php-sphinx-search": "~1.0" >, "minimum-stability": "stable" >

Require this package with composer:

composer require euclid1990/php-sphinx-search 

Update your packages with composer update or install with composer install .

Add boostrap autoload file:

require_once __DIR__ . '/../vendor/autoload.php'; use euclid1990\PhpSphinxSearch\SphinxSearch;
  • To use the Sphinx Search Service, you must register the provider when bootstrapping your Laravel application. There are essentially two ways to do this.

Find the providers key in config/app.php and register the Sphinx Search Service Provider.

'providers' => [ // . 'euclid1990\PhpSphinxSearch\Providers\SphinxSearchServiceProvider', ]
'providers' => [ // . euclid1990\PhpSphinxSearch\Providers\SphinxSearchServiceProvider::class, ]

Find the aliases key in config/app.php .

'aliases' => [ // . 'SphinxSearch' => 'euclid1990\PhpSphinxSearch\Facades\SphinxSearch', ]
'aliases' => [ // . 'SphinxSearch' => euclid1990\PhpSphinxSearch\Facades\SphinxSearch::class, ]
  • If you need to override the default configuration options (server/port), please use the config publish command
php artisan config:publish euclid1990/php-sphinx-search 
php artisan vendor:publish 

Please refer to demo/run.php or you can execute this command line:

require_once __DIR__ . '/../vendor/autoload.php'; use euclid1990\PhpSphinxSearch\SphinxSearch; $configArr = require __DIR__.'/../config/sphinx_search.php'; $config = ['sphinx_search' => $configArr]; $sphinxSearch = new SphinxSearch(new Illuminate\Config\Repository($config)); $keyword = 'source code'; $matchs = ['title', 'content']; $table = 'posts'; $columns = ['id', 'title', 'content']; $offset = 0; $limit = 10; $result = $sphinxSearch->search($keyword, $matchs, $table, $columns, $offset, $limit); echo "Search results for keyword: [$keyword].\n"; print_r($result->toArray());
$keywordEnglish = 'source code'; $keywordVietnamse = 'web nhanh mạnh'; $keywordJapanese = '私は です か'; $matchs = ['title', 'content']; $table = 'posts'; $columns = ['id', 'user_id', 'title', 'content', 'created_at']; // Facade class method $resultEnglish = \SphinxSearch::search($keywordEnglish, $matchs, $table); echo "Search results for English keyword: [$keywordEnglish].\n"; dump($resultEnglish->toArray()); $resultVietnamse = \SphinxSearch::search($keywordVietnamse, $matchs, $table); echo "Search results for Vietnamese keyword: [$keywordVietnamse].\n"; dump($resultVietnamse->toArray()); $resultJapanese = \SphinxSearch::search($keywordJapanese, $matchs, $table); echo "Search results for Japanese keyword: [$keywordJapanese].\n"; dump($resultJapanese->toArray()); // Helper sphinx_search($keyword, $matchs, $table, $columns); // Raw Query $query pl-s">SELECT id FROM posts WHERE MATCH('(@(title,content) source code)') LIMIT 1, 2"; sphinx_raw($query); // Get sphinxQL $sphinxQL = sphinx_ql(); $sphinxQL->select()->from($table)->execute(); // Get sphinxApi $keyword = 'the source'; $tables = 'posts' $resultApi = sphinx_api()->setMatchMode(SPH_MATCH_ANY) ->setFilter('category', [3]) ->query($keyword, $table);

Источник

Sphinx для поиска по MySQL базе данных. Обработка результатов на PHP

Удивительная особенность: создавать индексы, указывая не основной конфиг можно, а искать по таким индексам не получится, ищет только по конфигу : /etc/sphinxsearch/sphinx.conf Конфиг лежит по пути /etc/sphinxsearch/ берем его за основу, и делаем свой, для начала маленький:

source s_DB < # настройки подключения к БД type = mysql sql_host = localhost sql_user = userName sql_pass = SecPhrase sql_db = test sql_port = 3306 # optional, default is 3306 #ru sql_query_pre = SET NAMES utf8 sql_query_pre = SET CHARACTER SET utf8 #так быстрее, чем через tcp ip sql_sock = /var/run/mysqld/mysqld.sock mysql_connect_flags = 32 # 32- включение сжатие при обмене данными с БД >source item : s_DB < sql_query = \ SELECT id, title \ FROM items sql_attr_string = title >index item < source = item path = /home/user/project/var/sphinx/data/index/item charset_type = utf-8 >indexer < mem_limit = 32M >searchd < listen = 9312 listen = 9306:mysql41 log = /var/log/sphinxsearch/searchd.log query_log = /var/log/sphinxsearch/query.log read_timeout = 5 client_timeout = 300 max_children = 30 pid_file = /var/run/sphinxsearch/searchd.pid max_matches = 1000 seamless_rotate = 1 preopen_indexes = 1 unlink_old = 1 mva_updates_pool = 1M max_packet_size = 8M max_filters = 256 max_filter_values = 4096 max_batch_queries = 32 workers = threads # for RT to work compat_sphinxql_magics = 1 >
$sudo -u sphinxsearch indexer item --config /etc/sphinxsearch/sphinx.conf --rotate --print-queries

Перезапускаем sphinx: Пришлось сделать владельцем sphinxsearch /var/log/sphinxsearch И /var/run/sphinxsearch иначе выдавало какие-то warnings

$/etc/init.d/sphinxsearch restart
$search --config /etc/sphinxsearch/sphinx.conf comp

Доступно о сфинксе на русском написано у Игоря Чакрыгина: http://chakrygin.ru/2013/03/sphinx-install.html

Поиск из пхп

$page = 0; //передаем в скрипт текущую страницу $in_page = 12; // сколько выводить на странице // фраза для поиска по базе $phrase = 'phrase'; // подключаем Сфинкс $sphinx = new SphinxClient; $sphinx->SetServer("localhost", 9312); // режим поиска $sphinx->SetMatchMode( SPH_MATCH_EXTENDED ); // ищем хотя бы 1 слово из поисковой фразы // устанавливаем вес полей (коэффициент/индекс релевантности) $sphinx->SetFieldWeights(array ( 'title' => 50, 'short_title' => 40, 'mini_title' => 30, 'condition' => 10, 'info' => 10, 'description' => 15, 'price_description' => 5, )); // упорядочивание результатов по атрибутам switch($this->request->post('sort'))< case 'price': $sphinx->setSortMode(SPH_SORT_ATTR_ASC, 'min_item_price'); break; case 'price_desc': $sphinx->setSortMode(SPH_SORT_ATTR_DESC, 'max_item_price'); break; case 'new': $sphinx->setSortMode(SPH_SORT_ATTR_DESC, 'sale_start'); break; default: $sphinx->setSortMode(SPH_SORT_ATTR_DESC, 'buy_count'); > //устанавливаем всякие фильтры $sphinx->setFilter('bonus', array(1)); // находим диапазон цен, по фильтрам $sphinx->SetSelect('1 AS group_attr, MAX(max_item_price) AS max_price, MIN(min_item_price) AS min_price'); $sphinx->setGroupBy('group_attr', SPH_GROUPBY_ATTR); $sphinx->AddQuery($phrase); $sphinx->resetGroupBy(); $sphinx->SetSelect('*'); //фильтр по диапазону цен $price_from = intval($this->request->post('price_from')); $price_to = $this->request->post('price_to'); if(isset($price_to))< $price_to = intval($price_to); $sphinx->setFilterRange('price', $price_from, $price_to); > $sphinx->SetLimits($page*$in_page, $in_page, 1000); $sphinx->AddQuery($phrase); $result = $sphinx->runQueries(); // поисковый запрос if ( $result === false ) < echo 'Sphinx ошибка поиска :error', array(':error'=>$sphinx->GetLastError()); > else < if ( $sphinx->GetLastWarning() ) < Log::instance()->add(Log::WARNING, 'Sphinx warning :warning', array(':warning'=>$sphinx->GetLastWarning())); > if ( ! empty($result[1]["matches"]) ) < // если есть результаты поиска - обрабатываем их >>

Библиотека для PHP

$sudo apt-get install php-pear $sudo apt-get install php5-dev
$tar -xcf sphinx-2.1.9-release.tar.gz $cd sphinx-2.1.9-release/api/libsphinxclient $./configure $make $sudo make install $sudo sudo pecl install sphinx
// загружаем для всех пхп сфинкс $ echo "extension=sphinx.so" | sudo tee /etc/php5/conf.d/sphinx.ini // перезапуск апача $ sudo service apache2 restart // или php5-fpm $ sudo /etc/init.d/php5-fpm restart
$ echo "extension=sphinx.so" | sudo tee /etc/php5/mods-available/sphinx.ini // для апача $ sudo ln -s /etc/php5/mods-available/sphinx.ini /etc/php5/apache2/conf.d/20-sphinx.ini // для php5-cli: $ sudo ln -s /etc/php5/mods-available/sphinx.ini /etc/php5/cli/conf.d/20-sphinx.ini // перезапуск апача $ sudo service apache2 restart

Не удавалось запустить индексацию данных rotate т.к. процесс был запущен под root , таким образом: sudo /etc/init.d/sphinxsearch start, без судо не работало, выдает ERROR. Решение оказалось таким: процесс для сфинкса запускается при вызове комманды searchd и запускается именно под тем пользователем, под которым надо, далее все индексы обновляются и т.д. от этого пользователя.

Источник

Создание ознакомительного поискового движка на Sphinx + php

Перед началом использования сфинкса лучше сразу подготовить базу данных для более удобной индексации и поиска.
У меня есть три таблицы: products, companies, categories, соответственно товары, компании и категории товаров. Создадим view, в котором объединим те данные из всех трех таблиц, по которым будет идти поиск:

CREATE OR REPLACE VIEW `catalog` AS SELECT p.`id` , p.`id_company` , p.`id_category` , p.`name` , p.`keyword` , p.`short_desc` , com.`name` AS company_name, cat.`name` AS category_name FROM `products` p JOIN `categories` cat ON p.id_category = cat.id JOIN `companies` com ON p.id_company = com.id WHERE 1 

Поиск в моем случае ведется по полям: название, ключевое слово, краткое описание товара, название компании-производителя и название категории товара. В WHERE можно дописать дополнительные условия, например чтобы поиск шел только по активным компаниям и товарам. На этом подготовительные работы с базой данных закончены.

2. Установка Sphinx

Необходимо с оффсайта скачать свежий дистрибутив: www.sphinxsearch.com/downloads.html
Я скачал себе версию Win32 binaries w/MySQL support 1.10 beta. Далее распаковываем содержимое архива в какую-нибудь папку (я распаковал в C:\Sphinx)

Конфигурирование Sphinx

После скачивания и распаковки архива следующий шаг — настройка. Я в качестве основы взял файл sphinx.conf.in
В этом разделе просто буду приводить конфиги с небольшими комментариями, там вроде все понятно. Весь текст из этого раздела лежит в одном файле sphinx.conf.in

Источник данных
# Источник данных для поиска source catalog < # Тип данных # Доступные типы: mysql, pgsql, mssql, xmlpipe, xmlpipe2, odbc type = mysql # Необходимые параметры для подключения к базе данных sql_host = localhost sql_user = root sql_pass = sql_db = products sql_port = 3306 # опциональный, по умолчанию 3306 # пред-запрос, выполняется перед выполнением основного запроса на получение данных из базы # В нашей базе данные хранятся в UTF-8, чтобы поиск по русским символам работал успешно выполним соответсвующий запрос sql_query_pre = SET NAMES utf8 # запрос, который получает данные документов для поиска # первым полем обязательно должен идти уникальный положительный ID документа sql_query = \ SELECT * \ FROM catalog # поля, по которым может идти группировка, фильтрация и сортировка sql_attr_uint = id_company sql_attr_uint = id_category # document info query, ONLY for CLI search (ie. testing and debugging) # optional, default is empty # must contain $id macro and must fetch the document by that id sql_query_info = SELECT * FROM products WHERE индексации товаров
# индекс каталога товаров для поиска index catalog < # Источник данных для индексирования source = catalog # Адрес, где будут хранится данные индекса path = C:\Sphinx/data/catalog # Индекс с учетом морфологии morphology = stem_ru # Минимальная длина слова для индексации min_word_len = 1 # Кодировка charset_type = utf-8 >
Настройки поискового демона (службы)
# поисковый демон (служба) searchd < # какой порт и какой протокол "слушает" служба listen = 9312 # файл с логами log = C:\Sphinx/log/searchd.log # файл с логами поисковых запросов query_log = C:\Sphinx/log/query.log # PID file, searchd process ID file name # mandatory pid_file = C:\Sphinx/log/searchd.pid >

На этом конфигурирование сфинкса закончено.
Теперь установим нашу службу. Для этого в адресной строке пишем C:\Sphinx\bin\searchd —install —config C:\Sphinx\sphinx.conf.in —servicename SphinxSearch
Служба установлена и должна появится в администрирование — службы. Пока не запускаем — наши данные еще не проиндексированы.

3. Индексирование и тестовый поиск

Теперь в командной строке пишем C:\Sphinx\bin\indexer —all —config C:\Sphinx\sphinx.conf.in. Получаем результат вроде этого:

C:\Users\Iskander> C:\Sphinx\bin\indexer --all --config C:\Sphinx\sphinx.conf.in Sphinx 1.10-beta (r2420) Copyright (c) 2001-2010, Andrew Aksyonoff Copyright (c) 2008-2010, Sphinx Technologies Inc (http://sphinxsearch.com) using config file 'C:\Sphinx\sphinx.conf.in'. indexing index 'catalog'. collected 572 docs, 0.1 MB sorted 0.0 Mhits, 100.0% done total 572 docs, 115192 bytes total 0.380 sec, 303124 bytes/sec, 1505.19 docs/sec total 2 reads, 0.000 sec, 31.6 kb/call avg, 0.0 msec/call avg total 9 writes, 0.001 sec, 14.6 kb/call avg, 0.1 msec/call avg

Все, индекс создан. Теперь запускаем нашу службу SphinxSearch и в поисковой строке пишем что нибудь вроде
C:\Sphinx\bin\search —config C:\Sphinx\sphinx.conf.in computer и получаем результат

C:\Users\Iskander> C:\Sphinx\bin\search --config C:\Sphinx\sphinx.conf.in computer Sphinx 1.10-beta (r2420) Copyright (c) 2001-2010, Andrew Aksyonoff Copyright (c) 2008-2010, Sphinx Technologies Inc (http://sphinxsearch.com) using config file 'C:\Sphinx\sphinx.conf.in'. index 'catalog': query 'computer': returned 1 matches of 1 total in 0.000 sec displaying matches: 1. document=1, weight=2812, id_company=2, id_category=1263 id_company=2 id_category=1263 words: 1. 'computer': 1 documents, 2 hits 

4. Поиск из php

SetServer( "localhost", 9312 ); // Собственно поиск $cl->SetMatchMode( SPH_MATCH_ANY ); // ищем хотя бы 1 слово из поисковой фразы $result = $cl->Query("computer"); // поисковый запрос // обработка результатов запроса if ( $result === false ) < echo "Query failed: " . $cl->GetLastError() . ".\n"; // выводим ошибку если произошла > else < if ( $cl->GetLastWarning() ) < echo "WARNING: " . $cl->GetLastWarning() . " // выводим предупреждение если оно было "; > if ( ! empty($result["matches"]) ) < // если есть результаты поиска - обрабатываем их foreach ( $result["matches"] as $product =>$info ) < echo $product . "
"; // просто выводим id найденных товаров > > > exit;

Вот собственно и все, мы установили sphinx, проиндексировали нашу базу данных и написали код на php который ищет по нашей базе и выводит id найденных товаров.

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

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

Источник

Читайте также:  Python telegram bot поиск
Оцените статью