Предисловие
В предыдущей статье были интегрированы Springboot, Mybatis, Druid и Pagehelper, и были реализованы операции нескольких источников данных. Эта статья в основном представляет и использует Elastisearch, самую популярную поисковую систему, и использует ее в сочетании с Springboot.
Введение в Elasticsearch
Elasticsearch - это поисковый сервер, основанный на Lucene. Это фактически инкапсулирует Lucene и обеспечивает интерфейс операции API REST. Elasticsearch-это очень масштабируемый полнотекстовый поиск и анализ с открытым исходным кодом, который можно использовать для быстрого хранения, поиска и анализа больших данных.
Основные особенности Elasticsearch: распределенная, высокая доступность, асинхронное письмо, мульти-API, ориентированный на документ.
Концепции основных концепций Elasticsearch: почти в реальном времени, кластер, узел (сохранение данных), индекс, Shard (Shard Index Shards), Replicas (нарезка может устанавливать несколько реплик). Он может быстро хранить, искать и анализировать огромные объемы данных.
Вцена об использовании Elasticsearch: Википедия, переполнение стека, GitHub и т. Д.
Springboot интегрирует Elasticsearch
Прежде чем использовать Springboot для интеграции Elasticsearch, мы должны понять отношения между ними.
| Версия Spring Boot (x) | Spring Data Elasticsearch версия (Y) | Версия Elasticsearch (z) |
|---|---|---|
| x <= 1.3.5 | y <= 1.3.4 | z <= 1,7,2* |
| x> = 1.4.x | 2.0.0 <= y <5,0,0 ** | 2.0.0 <= z <5,0,0 ** |
Версия Springboot, которую мы используем здесь, - 1.5.9, а версия Elasticsearch - 2.3.5.
Используя Springboot для интеграции Elasticsearch, он обычно инкапсулируется с использованием SpringData, а затем интерфейс DAO Layer наследует класс ElasticSearchRepository. Этот класс реализует многие методы, такие как обычно используемый метод CRUD.
Использование SpringData
Во -первых, сделайте соответствующие подготовки перед использованием.
Конфигурация Maven заключается в следующем:
<Depective> <groupid> org.springframework.boot </GroupId> <ArtifactId> Spring-boot-starter-web </artifactid> <sersive> 1.5.9.Release </version> </artifactid> <grespect> <groupid> org.springframework.boot </GroupD> <ratifactid> spring-boot-starTaRTARTARTARTARTARTARTARSTARMIDASTARFARTARFARMIDSTARFARTICS.BOOT </GROUTID> <StrifactId> <версия> 1.5.9.release </version> </gethyserian>
Конфигурация приложения. Прозрачные
spring.data.elasticsearch.repositories.enabled = truepring.data.elasticsearch.cluster-nodes = 127.0.0.1/: 9300
Примечание: 9300 - порт клиента Java. 9200 - это интерфейс, который поддерживает Restful HTTP.
Больше конфигураций:
Spring.data.elasticsearch.cluster-name elasticsearch name. (По умолчанию: Elasticsearch)
spring.data.elasticsearch.cluster-nodes Список адресов кластера узлов, разделенных запятыми. Если не указано, запустите клиентский узел.
Spring.data.elasticsearch.propertie используется для настройки дополнительных свойств клиента.
spring.data.elasticsearch.repositories.enabled Включить репозиторий Elasticsearch. (По умолчанию: верно.)
Написание кода
Класс сущности
@Document (indexname = "userIndex", type = "user") открытый пользователь Пользователь реализует serializable { / ** * * / private static final long serialversionuid = 1l; / ** номер*/ частный длинный идентификатор; / ** Имя*/ Private String Имя; / ** возраст*/ частный целый возраст; / ** Описание*/ Приватная строка Описание; / ** Время создания*/ private String createm; // Getter и Setter опущены}При использовании SpringData он должен установить имя индекса и ввести класс Entity. По сравнению с традиционными базами данных, это эквивалентно библиотекам и таблицам.
Следует отметить, что как указание, так и тип должны быть в нижнем регистре !!!
Дао слой
public interface userdao расширяет ElasticSearchRepository <user, long> {}Слой DAO здесь относительно прост, просто наследуйте класс ElasticSearchRepository. Основными методами являются сохранение, удаление и поиск. Метод сохранения очень похож на вставку и обновление. Если нет, это будет добавлено, и если он будет, он будет покрыт. Метод удаления в основном для удаления данных и библиотек индекса. Что касается поиска, это запрос, в том числе некоторые часто используемые запросы, такие как страница, вес и т. Д.
Сервисный слой
@Servicepublic class userserviceimpl реализует userservice {@autowired private userdao userdao; @Override public boolean insert (пользователь пользователя) {boolean falg = false; try {userdao.save (user); falg = true; } catch (Exception e) {e.printstackTrace (); } return falg; } @Override public list <user> search (string searchContent) {QueryStringQueryBuilder Builder = new QueryStringQueryBuilder (SearchContent); System.out.println ("Заглавный запрос:"+Builder); Iterable <user> searchresult = userDao.search (Builder); Iterator <user> iterator = searchresult.iterator (); Список <user> list = new ArrayList <user> (); while (iterator.hasnext ()) {list.add (iterator.next ()); } return List; } @Override public list <user> searchUser (Integer PageNumber, Integer pagesize, String SearchContent) {// Параметры страниц Pagable Pagable = new PageRequest (PageNumber, PageSize); QueryStringQueryBuilder Builder = new QueryStringQueryBuilder (SearchContent); SearchQuery SearchQuery = new ContivenSearchQueryBuilder (). WithPagable (Pagable) .withquery (Builder) .build (); System.out.println ("Запись запроса:" + searchQuery.getQuery (). ToString ()); Page <user> SearchPageresults = userDao.Search (SearchQuery); return searchpageresults.getContent (); } @Override Public List <uster> SearchUserBy -Weight (String SearchContent) {// Query в соответствии с Weews FunctionScoreKiller functionScoreVeryBuilder = QueryBuilders.FunctionScoreQuery () .Add (QueryBuilders.Boolquery (). ОБРАЗОВАНИЕBUILDERS.WeightFactorfunction (10)) .Add (QueryBuilders.Boolquery (). Должен (QueryBuilders.matchquery («Описание», SearchContent)), баллфункция .Builders.weightFactorFunction (100)). SetMinscore (2); System.out.println ("Запрос:" + functionScorequeryBuilder.toString ()); Iteerable <user> searchresult = userDao.search (functionScorequeryBuilder); Iterator <user> iterator = searchresult.iterator (); Список <user> list = new ArrayList <user> (); while (iterator.hasnext ()) {list.add (iterator.next ()); } return List; }}Здесь я просто написал несколько методов, основным методом является запрос. Запросы включают полнотекстовый поиск, запрос на страницу и веса. Что нужно объяснить, так это весовой запрос. Чем выше балл веса, тем выше результат запроса. Если для других данных не установлен оценка, их оценка по умолчанию составляет 1. Если вы не хотите запрашивать эти операторы, просто используйте SetMinscore, чтобы установить его на более 1.
Тестирование кода
Вызовите интерфейс, чтобы добавить данные
Новые данные:
Post http: // localhost: 8086/api/user {«id»: 1, «Имя»: «Zhang San», «Возраст»: 20, «Описание»: «Zhang San-инженер по разработке Java», «CreateTM»: «2018-4-25 11:07:42»} {«ID»: «Имя»: «Li SI»: «Li Si»: « SI-это тестовый инженер "," createtm ":" 1980-2-15 19:01:32 "} {" id ": 3," name ":" wang wu "," Age ": 25," Описание ":" Wang wu-это инженер по операции и техническому обслуживанию ",« Createtm »:« 2016-8-21 06:11:32 »}}}} Провести полный текстовый запрос
просить
http: // localhost: 8086/api/user? SearchContent = инженер
возвращаться
[{«id»: 2, «имя»: «li si», «Возраст»: 14, «Описание»: «Li Si-это инженер-тест», «CreateTm»: «1980-2-15 19:01:32»}, {«ID»: 1, «На имя»: «Zhang San», «Age»: 20, «Описание»: «Zhang San San San "2018-4-25 11:07:42"}, {"id": 3, "имя": "Wang wu", "Age": 25, "Описание": "Wang wu-это инженер по эксплуатации и обслуживанию", "Createtm": "2016-8-21 06:11:32"}]] Выполнять запрос на страниц
просить
http: // localhost: 8086/api/user?
возвращаться
[{«id»: 2, «Имя»: «li si», «Возраст»: 14, «Описание»: «Li Si - инженер -тест»}, {«id»: 1, «Имя»: «Zhang San», «Возраст»: 20, «Описание»: «Zhang San - инженер Java Development»}]]] Выполнить весовой запрос
просить
http: // localhost: 8086/api/user2? SearchContent = li si
возвращаться
[{«id»: 2, «Имя»: «li si», «Возраст»: 24, «Описание»: «Li Si-инженер-тест», «CreateTM»: «1980-2-15 19:01:32»}]Утверждение печати веса запроса:
Query statement:{{ "function_score" : { "functions" : [ { "filter" : { "bool" : { "bool" : { "should" : { "match" : { "name" : { "query" : "Li Si", "type" : "boolean" } } } } } } } }, "weight" : 10.0 }, { "filter" : {"bool": {"должен": {"match": {"description": {"Query": "li si", "type": "boolean"}}}}}}, "Вес": 100.0}], "min_score": 2.0}}}, "вес": 100.0}], "min_score": 2.0}}}, ".Примечание. В тесте, поскольку минимальный вес SetMinscore установлен для разделения на 2, не будут отображаться нерелевантные данные. Если вы хотите отобразить его, просто удалите его в коде.
После добавления новых данных вы можете ввести: http: // localhost: 9200/_plugin/head/в браузере
Затем нажмите «Базовый запрос», чтобы просмотреть добавленные данные. Если вы хотите использовать запрос оператора, вы можете вставить заявление запроса, напечатанное консолью в программе, к интерфейсу запроса для запроса!
Примечание: я установил Elasticsearch здесь в Windows и установил головку плагина ES. Конкретные этапы установки находятся в конце статьи.
В дополнение к SpringData, на самом деле существуют другие методы для эксплуатации Elasticsearch.
Например, используйте Native Elasticsearch API и используйте класс TransportClient для его реализации.
Или используйте его, чтобы инкапсулировать весну, просто введите бобы в сервисный слой.
Пример:
@Autowired elasticsearchtemplate elasticsearchtemplate;
Тем не менее, приведенные выше методы имеют свои ограничения, то есть, поскольку версия Elasticsearch изменяется, соответствующий Java API также постоянно корректирует, то есть после того, как серверная версия ElasticSearch изменяется, код клиента, возможно, потребуется переписать.
Поэтому он представляет очень полезный сторонний инструмент JestClient. Он инкапсулирует Elasticsearch и заполняет пробел в клиенте интерфейса elasticsearch httprest. Он подходит для Elasticsearch 2.x или выше версий, и нет необходимости изменять код из -за изменения версии сервера Elasticsearch!
JestClient
Сначала добавьте следующие зависимости в Maven:
<Depective> <groupid> io.searchbox </GroupId> <artifactid> jest </artifactid> <serse> 5.3.3 </version> </depervice>
Затем напишите соответствующий тестовый код.
Комментарии в коде должны быть очень полными, поэтому я не буду слишком много говорить о коде здесь.
Импорт java.util.arraylist; import java.util.list; import org.elasticsearch.index.query.querybuilders; import org.elasticsearch.search.builder.searchsourcebuilder; importc.pancm.pojo.user; import io.searchbx. io.searchbox.client.jestClientFactory; import io.searchbox.client.jestresult; import io.searchbox.client.config.httpclientConfig; import io.searchbox.core.bulk; import io.searchbox.core.bulkresult; import.searchbox.core.corete. io.searchbox.core.documentresult; import io.searchbox.core.index; import io.searchbox.core.search; import io.searchbox.indices.createIndex; импорт io.searchbox.indices.deleteIndex; import io.searchbox.mandices.mapping.Meancapping.Memancepplции. Jesttest {private static jestclient jestclient; Private Static String indexName = "userIndex"; // частная статическая строка indexName = "userIndex2"; Private Static String TypeName = "user"; Private Static String Elasticips = "http://192.169.2.98:9200"; // частная статическая строка Elasticips = "http://127.0.0.1:9200"; public static void main (string [] args) бросает исключение {jestClient = getJestClient (); insertBatch (); serach1 (); serach2 (); serach3 (); jestclient.close (); } private static jestClient getJestClient () {jestClientFactory factory = new jestClientFactory (); factory.sethttpclientConfig (новый httpclientconfig.builder (elasticips) .conntimeout (60000) .ReadTimeOut (60000) .MultIThReaded (true) .build ()); вернуть factory.getObject (); } public static void insertBatch () {list <object> objs = new ArrayList <Object> (); objs.add (новый пользователь (1L, «Zhang San», 20, «Zhang San-инженер по разработке Java», «2018-4-25 11:07:42»); objs.add (новый пользователь (2L, "Li Si", 24, "Li Si-инженер-тестиер", "1980-2-15 19:01:32"); objs.add (новый пользователь (3L, «Ван Ву», 25, «Ван Ву-инженер по эксплуатации и обслуживанию», «2016-8-21 06:11:32»); логический результат = false; try {result = insertbatch (JestClient, IndexName, Typename, OBJS); } catch (Exception e) {e.printstackTrace (); } System.out.println ("Pactare new:"+result); } / *** Полный текстовый поиск* / public static void serach1 () {String Query = "Engineer"; try {searchsourcebuilder searchsourcebuilder = new SearchSourceBuilder (); SearchSourceBuilder.Query (QueryBuilders.querystringQuery (Query)); // Настройка страницы SearchSourceBuilder.from (0) .Size (2); System.out.println ("Полнотекстовый запрос поиска:"+searchsourcebuilder.tostring ()); System.out.println ("Полный текстовый поиск возвращает результат:"+search (jestclient, indexname, typename, searchsourcebuilder.tostring ())); } catch (Exception e) {e.printstackTrace (); }} / **. SearchSourceBuilder.Query (QueryBuilders.termerquery («Возраст», 24)); System.out.println («Оператор точного поиска:«+searchsourcebuilder.tostring ()); System.out.println («Точный поиск возвращает результат:»+search (jestclient, indexname, typename, searchsourcebuilder.tostring ())); } catch (Exception e) {e.printstackTrace (); }} / **. Строка от = "2016-8-21 06:11:32"; String to = "2018-8-21 06:11:32"; try {searchsourcebuilder searchsourcebuilder = new SearchSourceBuilder (); SearchSourceBuilder.Query (QueryBuilders.RangeQuery (CreateTM) .gte (от) .lte (to)); System.out.println ("Заявление об интервальном поиске:"+searchsourcebuilder.tostring ()); System.out.println ("Интервальный поиск возвращает результат:"+search (jestclient, indexname, typename, searchsourcebuilder.tostring ())); } catch (Exception e) {e.printstackTrace (); }} / ** * Создать индекс * @param indexname * @return * @throhs excection * / public boolean createIndex (JestClient JestClient, String IndexName) Throws Exception {jestResult jr = jestClient.execute (new createIndex.builder (indexName) .build ()); return jr.issucuceded (); } / ** * Новые данные * @param indexname * @param typename * @param source * @return * @throws exception * / public boolean insert (JestClient JestClient, String IndexName, String Typename, String Source) Throws Exception {putmapping putmapping = new putmapping.builder (indexname, typename, sourcuild (). Jestresult jr = jestclient.execute (putmapping); return jr.issucuceded (); } / ** * Данные запроса * @param indexname * @param typename * @return * @throhs exception * / public static String getIndexmapping (JestClient JestClient, String IndexName, String Typename) thripting exception {getMapping getMapping = new GetMaping.Builder (). AddIndex (indexName). Jestresult jr = jestclient.execute (getmapping); return jr.getjsonstring (); } / ** * Добавить данные в партиях * @param indexName * @param typeName * @param objs * @return * @throws exception * / public static boolean insertbatch (jestclient jestclient, string indexname, string typenam Bulk.Builder (). DefaultIndex (indexName) .defaulttype (typename); for (Object obj: objs) {index index = new Index.Builder (obj) .build (); насыпный. Addaction (индекс); } Bulkresult br = jestclient.execute (bulk.build ()); return br.Issucceeded (); } / ** * Полный текстовый поиск * @param indexName * @param typeName * @param Query * @return * @Throws Exception * / public Static String Search (JestClient JestClient, String IndexName, String TypeName, String Query) throws Exception {search = nevalder (query). .строить(); Jestresult jr = jestclient.execute (search); // system.out.println ("-"+jr.getjsonstring ()); // system.out.println ("-"+jr.getsourceasobject (user.class)); return jr.getsourceasString (); } / ** * Удалить индекс * @param indexname * @return * @throws Exception * / public boolean delete (JestClient JestClient, String IndexName) Throws Exception {jestResult jr = jestClient.execute (newleteDex.builder (indexName) .build ()); return jr.issucuceded (); } / ** * Удалить данные * @param indexname * @param typename * @param id * @return * @throws excection * / public boolean delete (JestClient JestClient, String IndexName, String TypeName, String Id) Throws Exception {documentResult dr = jestClient.execute (new Delete.builder (id) .index (indexname) .type (typename) .build ()); вернуть доктор, истекающий (); }ПРИМЕЧАНИЕ. Перед тестированием давайте сначала объясним, что версия Elasticsearch, установленная в локальной системе Windows, составляет 2.3.5, а версия Elasticsearch, установленная на сервере Linux, составляет 6.2.
Результаты теста
Полный текстовый поиск
Полнотекстовый запрос на поиск: {"from": 0, "size": 2, "Query": {"Query_string": {"Query": "Инженер"}}} Полный текстовый поиск Результаты: {"ID": 1, "Имя": "Zhang San", «Возраст»: 20, «Описание»: «Zhang San Инженер "," CreateTM ":" 2018-4-25 11:07:42 "}, {" id ": 2," имя ":" li si "," Age ": 24," Описание ":" Li Si-инженер-тестирование "," CreatetM ":" 1980-2-15 19:01:32 "}Совпадать с поиском
Точный оператор поиска запроса: {"Query": {"term": {"Age": 24}}} Точный поиск возврата результата: {"id": 2, "имя": "li si", "Возраст": 24, "Описание": "li si-тестовый инженер", "CreatetM": "1980-2-15 19:01:32"}Поиск интервала времени
Заявление об интервальном поиске: {"Query": {"range": {"createTm": {"from": "2016-8-21 06:11:32", "to": "2018-8-21 06:11:32", "include_lower": true, "include_upper": true}}}} Interval Search Result Results ": 1,": 1, ": 1,": 1, ": 1,": ":": ":": ":" stame ":": ":" stemper ":": ":" stame ". SAN "," AGE ": 20," Описание ":" Чжан Сан-инженер по разработке Java "," CreateTM ":" 2018-4-25 11:07:42 "}После добавления новых данных мы можем перейти в Linux Kibana для проведения соответствующих запросов, и результаты запроса следующие:
Примечание: Kibana - это программное обеспечение с открытым исходным кодом в Elk. Kibana предоставляет веб-интерфейсы для анализа журналов для Logstash и Elasticsearch, чтобы помочь обобщать, анализировать и поиск важных журналов данных.
Результаты, возвращаемые тестом в вышеуказанном коде, соответствуют нашим ожиданиям. Среди них используется только небольшая часть JestClient. Для получения дополнительной информации вы можете проверить официальную документацию JestClient.
Установите ElasticSearch на Windows
1. Подготовка документа
Адрес загрузки: https://www.elastic.co/downloads
Выберите версию, связанную с Elasticsearch, затем выберите Zip -файл Suffix для загрузки, а затем разкачивайте ее после загрузки.
2. Начните Elasticsearch
Перейти в каталог бин и запустить elasticsearch.bat
Затем введите: Localhost: 9200 на просмотре
Успешно отображение интерфейса означает успех!
3. Установите плагин ES
Установка заголовка интерфейса веб -управления
Введите каталог BIN, откройте CMD и введите интерфейс DOS
Enter: plugin install mobz/elasticsearch-head
Сделайте загрузку
После успешной загрузки, введите: http: // localhost: 9200/_plugin/head/
Если отображается интерфейс, установка будет успешной!
4. Зарегистрировать службу
Введите каталог BIN, откройте CMD и введите интерфейс DOS
Входить:
service.bat installservice.bat Start
После успеха введите
Services.msc
Перейдите к интерфейсу службы службы, чтобы напрямую просмотреть статус работы ES!
другой
Elasticsearch Официальный сайт API адрес:
https://www.elastic.co/guide/en/elasticsearch/client/java-api/2.3/index.html
Адрес jestclientgithub:
https://github.com/searchbox-io/jest (локальная загрузка)
Я поставил проект на GitHub.
https://github.com/xuwujing/springboot (локальная загрузка)
Суммировать
Вышеуказанное - все содержание этой статьи. Я надеюсь, что содержание этой статьи имеет определенную справочную ценность для каждого обучения или работы. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения. Спасибо за поддержку Wulin.com.