SphinxSearch пока, привет Elastic & Phalcon

Каждый день, месяц появляются новые инструменты для разработки. На протяжении 4 лет я использовал Sphinxsearch, но на днях, благодаря Сергею@serebro, мне пришлось познакомиться с Elasticsearch.

Сегодня я буду рассказывать вам о новом поисковом движке Elasticsearch, который становиться стандартом в выборе поискового движка или NoSQL базы данных для хранения данных в целях текстового поиска по ним.

Сайт проекта http://www.elasticsearch.org/.

По сути Elasticsearch — это новый фронтенд к широко известному индексу Lucene. Главное отличие от конкурентов — это гибкость и простота в использовании. Работа с сервисом происходит в виде общения с помощью REST HTTP интерфейса.

Плюсы

Я думаю, самое правильное, начать с плюсов:

Минусы

Как таковых не нашел. Если сравнивать с 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 нам нужно:

Зайдем в корень с проектом и установим понравившийся нам клиент, мой выбор это

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

Блог работает в alpha режиме. Если Вы заметили ошибку в статье или хотите предложить нововведения, то Вы можете уведомить меня, используя контакты, указанные на странице, или же сделав pull-request в статью

comments powered by Disqus