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