Пример учебного пособия по Node js Elastic Search

Пример учебного пособия по эластичному поиску Node js — это основная тема сегодняшнего дня. Elasticsearch — это поисковая система с открытым исходным кодом, которая становится чрезвычайно популярной благодаря своей высокой производительности и распределенной архитектуре. Elasticsearch построен на основе Apache Lucene, библиотеки высокопроизводительной системы текстового поиска. Хотя Elasticsearch может выполнять хранение и извлечение данных, его основная цель — не служить в качестве базы данных. Вместо этого это поисковая система (сервер), основной целью которой является индексирование, поиск и предоставление статистики по данным в реальном времени.

Если вы хотите узнать больше о Node.js, проверьте из этого курса NodeJS — Полное руководство (включая MVC, REST API, GraphQL)

Пример учебного пособия по эластичному поиску для Node js

В этом руководстве мы выполним интеграцию с Node.js и будем использовать его для индексации и поиска данных. Когда данные импортируются, они сразу становятся доступными для поиска. Elasticsearch не содержит схемы, хранит данные в документах JSON и может автоматически определять структуру данных и их тип.

Elasticsearch также полностью управляется API. Это означает, что практически любые операции можно выполнять с помощью простого RESTful API, используя данные JSON через HTTP. Он имеет множество клиентских библиотек почти для всех языков программирования, в том числе для JavaScript. В этом примере мы будем использовать официальную клиентскую библиотеку.

# Шаг 1. Установите Elasticsearch на Mac через Homebrew.

Мы начинаем это руководство с установки Elasticsearch . Устанавливаю на Mac. Поэтому введите следующую команду в своем терминале, чтобы установить Elasticsearch с помощью

 brew install elasticsearch 

Он установит его и запустит службы, используя следующую команду.

 brew services start elasticsearch 

# Шаг 2: Настройка среды Node.js.

Создайте новый Node.js проект с помощью следующей команды.

 mkdir node-elastic 

Теперь перейдите в папку проекта.

 cd node-elastic 

Инициализируйте файл package.json , используя следующую команду.

 npm init 

Нам нужно установить официальный пакет node.js elasticsearch .

 npm install elasticsearch -  save 

Внутри корня проекта создайте один файл с именем server.js.

Напишите следующий код внутри s файл erver.js .

//server.jsconst express = require ('express'); const elasticsearch = require ('elasticsearch'); const fs = require ('fs'  ); const app = express (); const PORT = 5000; const client = new elasticsearch.Client ({host: '127.0.0. 1: 9200 ', log:' error '}); app.listen (PORT, function () {console.log (' Сервер работает на PORT: ', PORT);}); 

Мы уже запустили эластичный сервис, когда мы установили его через homebrew .

Запустите сервер node.js, используя следующую команду.

 node server 

Итак, если ваш эластичный сервер работает на PORT: 9200 успешно, то вы не получите никаких ошибок и отобразит Сервер работает на PORT: 5000. Помните, что наш порт сервера node.js — 5000 и elasticsearch работает на PORT: 9200 .

# Шаг 3: Создайте образец данных.

Нам нужно проиндексировать данные, чтобы мы могли позже запросить эти данные. Теперь в корне проекта создайте один файл с именем data.json и добавьте следующий контент. Это пример данных, но в режиме реального времени это данные из базы данных.

 [{"id": "575084573a2404eec25acdcd", "title": "Id sint ex conquat ut.  "," журнал ":" Первый журнал "," том ": 54," номер ": 6," страницы ":" 255-268 "," год ": 2011," авторы ": [{" имя ":"  Керр "," фамилия ":" Ягода "," учреждение ":" Skyplex "," электронная почта ":" Kerr@Skyplex.info "}, {" имя ":" Фишер "," фамилия ":" Фермер ","  учреждение ":" Digique "," электронная почта ":" Fischer@Digique.biz "}, {" имя ":" Бренди "," фамилия ":" Рид "," учреждение ":" Фанфары "," электронная почта ":"  Brandie@Fanfare.com "}, {" имя ":" Мартинес "," фамилия ":" Брэдфорд "," учреждение ":" Конвейер "," электронная почта ":" Martinez@Comveyer.name "}, {" имя "  : «Лула», «фамилия»: «Чарльз», «учреждение»: «Гадтрон», «электронная почта»: «Lula@Gadtron.tv»}], «аннотация»: «Do occaecat rephenderit dolore proident nulla magna nostrud aliquip dolore  . Officia minim eiusmod eu minim ea labore velit ea. Voluptate  sit deserunt duis REPREHENDERIT. "," ссылка ":" http://ea.ca/575084573a2404eec25acdcd.pdf "," ключевые слова ": [" aute "," nisi "," adipisicing "," fugiat "," qui "]  , "body": "Quis pariatur velit ipsum tempor eu ad.  Do nisi dolore tempor anim eiusmod in ea aliqua velit fugiat culpa sunt ea.  Labore sint officia Adipisicing occaecat incididunt sunt labore elit.  Pariatur officia nulla anim labore enim non labore Laborum eu eu "}, {" id ":" 5750845735dff7db71032593 "," title ":" Consectetur velit do esse Laborum duis cillum mollit Lorem aliquip occaecat. "," журнал ":" Второй журнал "," том ": 11," номер ": 11," страницы ":" 277-302 "," год ": 1987," авторы ": [{" имя ":"  Бек "," фамилия ":" Браунинг "," учреждение ":" Снежок "," электронная почта ":" Beck@Snowpoke.us "}, {" имя ":" Трейси "," фамилия ":" Вон ","  учреждение ":" Zaggle "," электронная почта ":" Tracy@Zaggle.me "}, {" имя ":" Бритни "," фамилия ":" Хадсон "," учреждение ":" Exozent "," электронная почта ":"  Britney@Exozent.net "}, {" имя ":" Алисса "," фамилия ":" Перес "," учреждение ":" Buzzmaker "," электронная почта ":" Alissa@Buzzmaker.org "}, {" имя "  : «Дарлин», «фамилия»: «Любовь», «учреждение»: «Гидроком», «электронная почта»: «Darlene@Hydrocom.co.uk»}], «аннотация»: «Anim labore nulla et et sunt.  Esse ad enim velit culpa irure.  Irure cillum culpa velit упражнение сладострастный синт.  Incididunt voluptate minim ipsum est sint amet sit esse.  Laboris aute ut sint nulla Concectetur nulla non veniam dolore eu aute упражнения.  Commodo aute ea duis qui officia quis nisi conquat adipisicing enim magna dolore nisi.  Lorem est duis dolor sint est id culpa.  Sunt proident conctetur ex deserunt do adipisicing fugiat incididunt nulla aliquip officia.  Occaecat esse dolor voluptate aute et ad deseruntmodo nisi.  Lorem ipsum cupidatat nostrud nisi Lorem minim ut excepteur aute. "," Ссылка ":" http://prehenderit.io/5750845735dff7db71032593.pdf "," ключевые слова ": [" ipsum "," nostrud "," Commodo "," fugiat  "]," body ":" Adipisicing nulla mollit sunt deserunt.  Долор ноструд велит репрехендерит долор долоре.  Sunt officia culpa labore officia Cupidatat Commodo eiusmod sit cupidatat aliqua ullamco et sit Lorem.  Amet cupidatat labouris anim mollit "}, {" id ":" 575084570b63f5fd28d23f48 "," title ":" Et duis labourum id Laborum qui direhenderit labourum. "," Journal ":" Третий журнал "," volume ": 18," number  ": 12," страницы ":" 247-265 "," год ": 2013," авторы ": [{" имя ":" Летисия "," фамилия ":" Инграм "," учреждение ":" Acruex ",  «email»: «Leticia@Acruex.info»}], «abstract»: «Ea velit aute ipsum tempor excepteur sint magna labore et occaecat.  Exercitation nulla officia enim qui ex proident ullamco quis irure.  Ut ullamco proident et culpa fugiat qui.  Excepteur Laborum Conctetur mollit dolore fugiat proident et sint. "," Ссылка ":" http://dolor.biz/575084570b63f5fd28d23f48. pdf "," ключевые слова ": [" irure "," conquat "," incididunt "]," body ":" Enim occaecat incididunt irure Lorem id.  Proident enim duis dolore culpa ut velit consquat excepteur ullamco sit excepteur cupidatat minim qui.  Aliqua sunt ipsum magna non elit consquat voluptate adipisicing.  Ipsum ad ut in irure non eu ea.  Non sit enim ipsum ea nisi officia do incididunt minim ipsum mollit labouris deserunt labore. "}, {" Id ":" 575084573ae731ef0dc821c6 "," title ":" Nisi sunt ea eiusmod elit irure amet esse magna. "," Journal ":"  Четвертый журнал »,« том »: 40,« номер »: 7,« страницы »:« 133-162 »,« год »: 1985,« авторы »: [{« имя »:« Росарио »,« фамилия »:  "Уотерс", "учреждение": "Unq", "электронная почта": "Rosario@Unq.com"}, {"имя": "Гонсалес", "фамилия": "Кляйн", "учреждение": "Гинкоген",  "электронная почта": "Gonzalez@Ginkogen.name"}, {"имя": "Корина", "фамилия": "Фишер", "учреждение": "Орбоид", "электронная почта": "Corina@Orboid.tv"}  , {"имя": "Соня", "фамилия": "Адамс", "учреждение": "Пирамида", "электронная почта": "Sonia@Pyramis.ca"}, {"имя": "Карри", "фамилия  ":" Шарп "," учреждение ":" Cytrak "," электронная почта ":" Curry@Cytrak.us "}]," abstract ":" Lorem anim deserunt mollit dolore consctetur dolor ex amet do et tempor sunt.  Officia nulla magna aliqua mollit voluptate mollit culpa minim.  Ad eiusmod magnaexitation anim sint ut consquat adipisicing veniam irure minim.  Dolore aute adipisicing elit quis in in labouris excepteur minim.  Velit veniam labore pariatur duis anim esse.  Duis non aute ullamco ex voluptate in nulla est enim sit dolore.  Et cupidatat aliquamodo veniam incididunt ea proident dolore elit et amet mollit minim.  Exercitation amet nisi consctetur irure nulla proident esse do ullamco veniam ea sint qui. "," Ссылка ":" http://pariatur.me/575084573ae731ef0dc821c6.pdf "," ключевые слова ": [" irure "," cupidatat "," nostrud  "]," body ":" Упражнение nostrud ullamco ad sit sint occaecat do ullamco magna.  Eu aute упражнения deserunt velit.  Et minim ex do anim adipisicing consumer elit.  Laborum excepteur minim ea incididunt ipsum esse non labouris conquat mollit упражнение ea.  Eiusmod irure dolor pariatur ad est irure excepteur aliquip quis voluptate aute et eiusmod fugiat. "}] 

Это массив из 4 элементов. Итак, когда мы индексируем наши данные, если мы индексируем их правильно, то длина данных 4, и мы это докажем.

# Шаг 4. Добавьте образец данных для индексации.

Хорошо, тогда напишите следующий код внутри server.js .

//server.jsconst express = require ('express'); var elasticsearch = require ('elasticsearch'); const fs = require ('fs'  ); const app = express (); const PORT = 5000; const client = new elasticsearch.Client ({host: '127.0.0.1:9200', log: 'error'}); client.ping ({requestTimeout: 30000}  , функция (ошибка) {if (ошибка) {console.error ('кластер elasticsearch не работает!');} else {console.log ('Все в порядке');}}); const bulkIndex = function bulkIndex (index,  тип, данные) {let bulkBody = [];  data.forEach (item => {bulkBody.push ({index: {_index: index, _type: type, _id: item.id}}); bulkBody.push (item);});  client.bulk ({body: bulkBody}) .then (response => {let errorCount = 0; response.items.forEach (item => {if (item.index && item.index.error) {console.log (+  + errorCount, item.index.error);}}); console.log (`Успешно проиндексировано $ {data.length - errorCount} из $ {data.length} items`);}) .catch (console.err)  ;  }; асинхронная функция indexData () {const articleRaw = await fs.readFileSync ('./data.json');  const article = JSON.parse (articleRaw);  console.log ("$ {article.length} элементов, извлеченных из файла данных");  bulkIndex ('библиотека', 'статья', статьи);  }; indexData (); app.listen (PORT, function () {console.log ('Сервер работает на PORT:', PORT);}); 

Здесь мы создали функция под названием

Внутри этой функции мы читаем данные из файла data.json . Затем мы проанализировали эти данные в JSON и передали эти данные в функцию в качестве параметра, называемого функцией bulkIndex () .

Массовый API делает это возможным. для выполнения множества операций index/delete за один вызов API . Это может значительно увеличить скорость индексации.

# Шаг 5: Проверьте индексацию данных.

Мы можем проверить, что индексируются ли наши данные или нет, путем добавления кода в наше приложение.

Давайте создадим еще один файл с именем verify.js внутри корневой папки.

Добавьте следующий код в файл verify.js .

//verify.jsconst elasticsearch = require ('elasticsearch'); const  client = new elasticsearch.Client ({host: '127.0.0.1:9200', log: 'error'}); function index () {return client.cat.indices ({v: true}) .then (console.log  ) .catch (err => console.error (`Ошибка подключения к клиенту es: $ {err}`));  } module.exports = функция verify () {консоль. log (`информация об индексах elasticsearch:`);  index ();} 

Если данные правильно проиндексированы, тогда мы можем увидеть счетчик 4, потому что мы проиндексировали массив элементов, длина которого равна 4. Теперь импортируйте эту функцию внутри server.js .

//server.jsconst express = require ('express'); var elasticsearch = require ('elasticsearch'); const fs = require ('  fs '); const app = express (); const PORT = 5000; const verify = require (' ./verify '); const client = new elasticsearch.Client ({host:' 127.0.0.1:9200 ', log:'  error '}); client.ping ({requestTimeout: 30000}, function (error) {if (error) {console.error (' 'elasticsearch cluster is down!');} else {console.log ('Все в порядке'  );}}); const bulkIndex = function bulkIndex (index, type, data) {let bulkBody = [];  data.forEach (item => {bulkBody.push ({index: {_index: index, _type: type, _id: item.id}}); bulkBody.push (item);});  client.bulk ({body: bulkBody}) .then (response => {let errorCount = 0; response.items.forEach (item => {if (item.index && item.index.error) {console.log (+  + errorCount, item.index.error);}}); console.log (`Успешно проиндексировано $ {data.length - errorCount} из $ {data.length} items`);}) .catch (console.err)  ;  }; асинхронная функция indexData () {const articleRaw = await fs.readFileSync ('./data.json');  const article = JSON.parse (articleRaw);  console.log ("$ {article.length} элементов, извлеченных из файла данных");  bulkIndex ('библиотека', 'статья', статьи);  }; indexData (); verify (); app.listen (PORT, function () {console.log ('Сервер работает на PORT:', PORT);}); 

Сохраните файл, перейдите в терминал и перезапустите сервер node.js. Вы можете увидеть что-то вроде следующего.

Это означает, что мы успешно проиндексировали данные. Теперь мы можем запросить данные и получить результат.

# Шаг 6: запросить elasticsearch и получить данные.

Сначала мы получаем все журналы из elasticsearch.

Внутри корневой папки создайте один файл с именем search.js и добавьте в него следующий код.

//search.jsconst elasticsearch = require ('elasticsearch'); const client = new elasticsearch.Client ({хост: '127.0.0.1:9200', log: 'error'});  const search = поиск функции (индекс, тело) {return client.search ({индекс: индекс, тело: тело});  };  module.exports = function searchData () {let body = {size: 4, from: 0, query: {match_all: {}}};  search ('library', body) .then (results => {console.log (`found $ {results.hits.total} items in $ {results.took} ms`); console.log (` возвращенные журналы: `  ); results.hits.hits.forEach ((hit, index) => console.log (hit._source.journal))}) .catch (консоль. ошибка);  }; 

Итак, мы уже проиндексировали данные, нам просто нужно получить все журналы из elasticsearch. Итак, мы передали два параметра функции search () , предоставляемой elasticsearch.

  1. имя индекса
  2. body

Body объект содержит размер записей и параметр запроса. Этот параметр обычно поступает со стороны клиента, где пользовательский поисковый запрос вводится из окна поиска. Здесь мы сопоставляем все записи журналов и выводим их на консоль. Теперь мы можем импортировать этот файл search.js в server.js.

Итак, наш Файл search.js выглядит так.

//server.jsconst express = require ('express'); var elasticsearch = require ('elasticsearch'); const fs = require (  'fs'); const app = express (); const PORT = 5000; const verify = require ('./verify'); const searchData = require ('./search'); const client = new elasticsearch.Client ({  хост: '127.0.0.1:9200', журнал: 'ошибка'}); client.ping ({requestTimeout: 30000}, функция (ошибка) {if (ошибка) {console.error ('кластер elasticsearch не работает!')  ;} else {console.log ('Все в порядке');}}); const bulkIndex = function bulkIndex (index, type, data) {let bulkBody = [];  data.forEach (item => {bulkBody.push ({index: {_index: index, _type: type, _id: item.id}}); bulkBody.push (item);});  client.bulk ({body: bulkBody}) .then (response => {let errorCount = 0; response.items.forEach (item => {if (item.index && item.index.error) {console.log (+  + errorCount, item.index.error);}}); console.log (`Успешно проиндексировано $ {data.length - errorCount} из $ {data.length} items`);}) .catch (console.err)  ;  }; асинхронная функция indexData () {const articleRaw = await fs.readFileSync ('./data.json');  const article = JSON.parse (articleRaw);  console.log ("$ {article.length} элементов, извлеченных из файла данных");  bulkIndex ('библиотека', 'статья', статьи);  };//indexData ();//verify (); searchData (); app.listen (PORT, function () {console.log ('Сервер работает на PORT:', PORT);}); 

Здесь я прокомментировал две функции, потому что мы уже проиндексировали данные. Это не лучший способ предотвратить переиндексирование, но для данного примера этого достаточно. Сохраняем файл и видим консоль.

# Шаг 7. Поиск по определенному запросу.

Внутри корневой папки создайте один файл с именем search_term.js и добавьте следующий код .

//search_term.jsconst elasticsearch = require ('elasticsearch'); const client = new elasticsearch.Client ({host: '127.0.0. 1: 9200 ', журнал:' ошибка '}); const search = функция поиска (индекс, тело) {return client.search ({index: index, body: body});  }; module.exports = function searchTerm () {let body = {size: 4, from: 0, query: {match: {journal: {query: 'Fir', minimum_should_match: 2, fuzziness: 2}}}};  console.log (`получение документов, журнал которых соответствует '$ {body.query.match.journal.query}' (одновременное отображение $ {body.size} элементов) ...`);  search ('библиотека', body) .then (results => {console.log (`found $ {results.hits.total} items in $ {results.took} ms`); if (results.hits.total> 0  ) console.log (`возвращенные журналы:`); results.hits.hits.forEach (hit => console.log (hit._source.journal));}) .catch (console.error);  }; 

Здесь наша основная часть запроса выглядит так.

 query: {match: {journal: {query: 'Fir', minimum_should_match: 2, fuzziness  : 2}}} 

Запрос описывает, что нам нужно найти термин Fir в значении журнала. Если он соответствует как минимум двум символам, он даст нам результат.

Импортируйте этот файл в файл server.js .

//server.jsconst express = require ('express'); var elasticsearch = require ('elasticsearch'); const fs = require ('fs'); const app = express (); const PORT = 5000; const  verify = require ('./verify'); const searchData = require ('./search'); const searchTerm = require ('./search_term'); const client = new elasticsearch.Client ({host: '127.0.0.1  : 9200 ', журнал:' ошибка '}); client.ping ({requestTimeout: 30000}, функция (ошибка) {if (ошибка) {console.error (' кластер elasticsearch не работает! ');} Else {console.  log ('Все в порядке');}}); const bulkIndex = function bulkIndex (index, type, data) {let bulkBody = [];  data.forEach (item => {bulkBody.push ({index: {_index: index, _type: type, _id: item.id}}); bulkBody.push (item);});  client.bulk ({body: bulkBody}) .then (response => {let errorCount = 0; response.items.forEach (item => {if (item.index && item.index.error) {console.log (+  + errorCount, item.index.error);}}); console.log (`Успешно проиндексировано $ {data.length - errorCount} из $ {data.length} items`);}) .catch (console.err)  ;  }; асинхронная функция indexData () {const articleRaw = await fs.readFileSync ('./data.json');  const article = JSON.parse (articleRaw);  console.log ("$ {article.length} элементов, извлеченных из файла данных");  bulkIndex ('библиотека', 'статья', статьи);  };//indexData ();//verify ();//searchData (); searchTerm (); app.listen (PORT, function () {console.log ('Сервер работает на PORT:', PORT);  }); 

Наконец, сохраните файл и посмотрите результат в консоли.

Итак, мы выполнили поиск по всем записям и конкретному термину. Это базовое руководство по elasticsearch в node.js, и вы можете найти больше на его исходная документация.

Наконец, Пример учебного пособия по эластичному поиску для Node js с нуля закончен. Я разместил этот код на Github.

Код Github

Оцените статью
nanomode.ru
Добавить комментарий