И так, допустим у нас есть сотрудник:
{
"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. Что такое Elasticsearch и как его установить
- Elasticsearch. Добавление данных (индексация)
- Elasticsearch. Извлечение данных
- Elasticsearch. Поиск, фильтры - Query DSL
- Elasticsearch. Полнотекстовый поиск
- Elasticsearch. Выделение результата поиска
- Elasticsearch. Обновление, удаление документа
Предыдущая часть: Elasticsearch. Поиск, фильтры - Query DSL
devreadwrite.com



Подборка адаптивных шаблонов для вашей CMS
Статьи по
Как получить и установить HTTPS сертификат на сайта

Комментарии
Здравствуйте. Хочу сделать сайт на HTML файлах с добавкой htaccess, чтобы они обрабатывались как PHP или сразу использую расширение PHP. Как приделать к сайту поиск на Elasticsearch? Планирую взять хостинг с виртуальным выделенным сервером. Не могли бы Вы написать статью на эту тему, где будет код, который например с помощью include вставлю на страницы и появится поиск для русскоязычных текстов? Если реклама Adsense на сайте даст доход (наверное там будет несколько сотен тысяч страниц), то планирую отблагодарить Вас потом.
Ответить