И так, допустим у нас есть сотрудник:

{   
    "first_name" : "John",    
    "last_name" :  "Smith",
    "age" :        25,
    "about" :      "I love to go rock climbing",
    "interests": [ "music" ]
}

Найдем всех пользователей, которые увлекаются скалолазанием ("about" : "I love to go rock climbing").

Для этого добавим еще пользователя:

$curl -XPUT 'http://localhost:9200/megacorp/employee/100 ' -d '
{ 
    "name":"Jane",
    "last_name" :"Smith",
    "age" :32,
    "about" :"I like to collect rock albums",    
    "interests": [ "sports", "music" ]
}'

"about" :"I like to collect rock albums", наш новый пользователь увлекается коллекционированием рок альбомов.

Полнотекстовый поиск

Начинаем искать.

Команда

GET /megacorp/employee/_search
{
    "query" : 
    {
        "match" : 
        {
            "about" : "rock climbing"    
        }    
    }
}

Поиск по фразам

Если мы хотим найти сотрудников которые имеюют фразы "rock" и "climbing" в описании и которые отображаются рядом друг с другом во фразе "rock climbing". То для этого мы меняем параметр с match на match_phrase

Команда:

GET /megacorp/employee/_search
{
    "query" : 
    {
        "match_phrase" : 
        {    
            "about" : "rock climbing"    
        }
    }
}

CURL:

$curl -XPOST 'localhost:9200/megacorp/employee/_search?pretty' -d '
{
    "query" : 
    {
        "match" : 
        {    
            "about" : "rock climbing"
        }
    }
}'

Получаем, что-то вроде:

{
    ...
    "hits": {
    "total":2,
    "max_score":0.16273327,
    "hits": [
    {
        ...
        "_score":0.16273327,
        "_source": {
        "first_name":"John",
        "last_name":"Smith",
        "age":25,
        "about":"I love to go rock climbing",
        "interests": [ "sports", "music" ]
    }
},
{
    ...
    "_score":0.016878016,
    "_source": 
    {
        "first_name":"Jane",
        "last_name":"Smith",
        "age":32,
        "about":"I like to collect rock albums",
        "interests": [ "music" ]
    }
}

Мы получили два пользователя. Elasticsearch отсортировал результат по релевантности (то, что максимально соответствует поиску - выводится первым). У первого пользователя есть слова "rock climbing" (точное совпадение с тем словом, что мы искали) и этот пользователь показался первым. У второго пользователя есть слово "rock" (I like to collect rock albums) и он выводится вторым.

PHP:

require 'vendor/autoload.php';
$client = Elasticsearch\ClientBuilder::create()->build();
$params = [
            'index' => 'megacorp',
            'type'  => 'employee',
            'body'  => [
                'query' => [
                    'match' => [
                         "about" => "rock climbing"
                    ]
                ]
            ]
        ];
try {
    $response = $client->search($params);
 catch (Exception $e) {
    var_dump($e->getMessage());        
}
print_r($response);

Yii2:

$params = [
    'match' => [
        "about" => "rock climbing"
    ]
];
$model = Megacorp::find()->query($params)->all();
var_dump($model);

Дополнительно

Предыдущая часть: Elasticsearch. Поиск, фильтры - Query DSL