SphinxSearch пока, привет Elastic & Phalcon
Каждый день, месяц появляются новые инструменты для разработки. На протяжении 4 лет я использовал Sphinxsearch
, но на днях,
благодаря Сергею@serebro, мне пришлось познакомиться с Elasticsearch
.
Сегодня я буду рассказывать вам о новом поисковом движке Elasticsearch
,
который становиться стандартом в выборе поискового движка или NoSQL базы данных для хранения данных в целях текстового поиска по ним.
Сайт проекта http://www.elasticsearch.org/.
По сути Elasticsearch
— это новый фронтенд к широко известному индексу Lucene
.
Главное отличие от конкурентов — это гибкость и простота в использовании. Работа с сервисом происходит в виде общения с помощью REST HTTP интерфейса.
Плюсы
Я думаю, самое правильное, начать с плюсов:
- Скорость
- Плагины
- Простота настройки (вспоминая sphinx не могу не нарадоваться)
- JSON, так как протокол сделан поверх HTTP сервера
- Кроссплатформенность (написан на Java)
- Realtime индексация
- Облачность
- Открытый исходный код
Минусы
Как таковых не нашел. Если сравнивать с Sphinxsearch
, то он проигрывает, причем без вариантов (конфигурация, морфология, настройка индексации, нет REST HTTP).
Установка
Установка Elasticsearch
не сложный процесс. Для начала нужно перейти по ссылке http://www.elasticsearch.org/overview/elkdownloads/
Ubuntu\Debian
Если вы используете Debian family систему то процесс установки будет следующим:
cd /tmp
wget https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.5.2.deb
sudo dpkg -i elasticsearch-1.5.2.deb
sudo service elasticsearch start
Mac OS X
Когда есть brew все просто:
brew install elasticsearch
Не забываем проверить сервер зайдя на http://localhost:9200/.
Используя curl
curl -X GET http://localhost:9200/
Плагины
Elasticsearch
радует поддержкой многих функциональных плагинов к нему.
Самые популярные:
Kibana - это админ панель для анализа аналитики и поиска.
Elasticsearch Gui - это GUI написанный на AngularJS.
Рекомендую еще расширение Postman для браузеров на основе Chromium (для легкого создания запросов).
Пробуем в деле по HTTP REST
Добавление записей в индекс
Для примера создадим индекс продуктов магазина site и добавим 3 продукта:
curl -XPUT 'http://localhost:9200/site/products/1' -d '
{
"title": "Super product",
"price": 12345.00
}'
curl -XPUT 'http://localhost:9200/site/products/2' -d '
{
"title": "Super product 1234",
"price": 500.00
}'
curl -XPUT 'http://localhost:9200/site/products/3' -d '
{
"id": "1",
"title": "Super product fdsfs",
"price": 500.00
}'
Поиск
Ищем все продукты с названием Super:
curl -XGET 'http://localhost:9200/site/products/_search?q=title:Super&pretty=true'
Подсчитываем количество продуктов с ценой равной 500
curl -XGET 'http://localhost:9200/site/products/_search?q=price:500&pretty=true'
Клиенты в PHP
Для того что бы использовать ElasticSearch в PHP нам нужно:
- PHP >= 5.3.9
- Composer
- Curl ext
Зайдем в корень с проектом и установим понравившийся нам клиент, мой выбор это
composer require ruflin/elastica
Пример использование
После установки библиотеке создадим клиент:
<?php
require 'vendor/autoload.php';
$client = new \Elastica\Client();
Добавление документа
$id = 1;
$product = array(
'id' => $id,
'title' => 'test product',
'price' => 12345.00,
'_boost' => 1.0
);
$productDocument = new \Elastica\Document($id, $product);
// Добавление продукта
$elasticaType->addDocument($productDocument);
// Обновление индекса
$elasticaType->getIndex()->refresh();
Поиск
$query = new Elastica\Query();
$query
->setFrom(50)
->setSize(10)
->setSort(['price' => 'asc'])
->setFields(['id', 'title', 'price'])])
->setExplain(true)
->setVersion(true)
->setMinScore(0.5);
$client->setQuery($query);
var_dump($search->count()); // Кол-во элементов по запросу
/** @var \Elastica\ResultSet */
$resultSet = $search->search();
foreach ($search->scanAndScroll() as $scrollId => $resultSet) {
// ...
}
Лучше всего смотреть все в документации.
Использование в Phalcon
Установим библиотеку для легкой работы:
composer require ovr/phalcon-elasticsearch
Создадим наш сервис:
$client = new \Elastica\Client($di->get('config')->elastica->toArray());
return $client;
Создадим модель:
<?php
namespace Catalog\Model;
use Elastica\Exception\NotFoundException;
use Elastica\Query;
use Phalcon\DI;
use Phalcon\DI\Injectable;
class Product extends Injectable
{
use ElasticModelTrait;
protected static $index = 'my-project';
protected static $type = 'products';
public $data;
/**
* @param array $query
* @param array $options
* @return \Elastica\ResultSet
*/
public static function find(array $query = [], array $options = null)
{
return static::getStorage()->search($query, $options);
}
}
Просто запрос:
$query = [
'_source' => [
'id',
'title'
],
'size' => 5,
];
var_dump(Product::find($query)->getResults());
Хорошим примером работы с Elasticsearch
будет проект http://phalconist.com/.
Русское сообщество
Поисковый движок «Elasticsearch» во ВКонтакте.
Выводы
Elasticsearch
- это отличнейшая замена Sphinxsearch
, которую уже можно взять и использовать прямо сейчас :) Выбор за тобой :3