ElasticSearch初学者教程

1.简介

在此示例中,我们将演示如何使用Elasticsearch , Elasticsearch是一个基于Apache Lucene的分布式自由文本搜索和分析数据库引擎,具有一个基于maven的简单Java客户端。

在撰写本文时,我们将使用最新版本的Elasticsearch,即ES v6.1.2。 对于此示例,我们使用以下技术:

  • Maven 3
  • Java 8
  • Elasticsearch 6.1.2

Elasticsearch因其通过RESTful API进行通信的能力而闻名。

这意味着我们将使用API​​以及HTTP方法(如GET,POST,PUT和DELETE)与数据库进行交互。

它是一个高度可扩展的分布式数据库,可使用Apache Lucene出色地实现。

有关Elasticsearch的其他一些功能包括:

  • Elasticsearch的总依赖项大小仅为300 KB,非常轻巧
  • Elasticsearch仅专注于查询的性能。 这意味着无论对数据库执行什么操作,它们都经过高度优化和可扩展
  • 这是一个高度容错的系统。 如果集群中有单个Elasticsearch节点死亡,则主服务器将非常Swift地确定问题,并将传入的请求尽快路由到新节点
  • Elasticsearch的专长在于可索引文本数据,可根据标记和过滤器进行搜索

尽管当使用分布式自由文本搜索和分析引擎时,Elasticsearch是一个不错的选择,但在进行其他一些操作时,它可能不是最适合的数据库:

  • 计算总数和平均值之类的运算
  • 使用回滚执行事务查询
  • 管理在多个给定条件下唯一的记录

这意味着Elasticsearch是一个基于用例的高度数据库,但就其自己的领域而言却是一个出色的数据库。

2.先决条件

因为maven是Java工具,所以您必须在计算机上安装Java才能继续。 您可以在此处下载Java。

一旦在系统上安装了Java,就必须安装maven。 您可以从此处下载Maven。

最后,您需要安装Elasticsearch。 您可以从此处下载它,然后按照适用于您的操作系统的步骤进行操作。 请注意,本课程将使用v6.1.2。 现在,其他版本可能会以完全相同的方式工作。 您可以通过在浏览器中打开以下URL来验证ES是否正在运行:

localhost:9200

您应该得到如下响应:

{"name": "wKUxRAO","cluster_name": "elasticsearch","cluster_uuid": "gvBXz7xsS5W4zlZuiADelw","version": {"number": "6.1.2","build_hash": "5b1fea5","build_date": "2018-01-10T02:35:59.208Z","build_snapshot": false,"lucene_version": "7.1.0","minimum_wire_compatibility_version": "5.6.0","minimum_index_compatibility_version": "5.0.0"},"tagline": "You Know, for Search"
}

请注意, elasticsearch是Elasticsearch中的默认集群名称。

3.项目设置

我们将使用许多Maven原型之一为我们的示例创建一个示例项目。 要创建项目,请在将用作工作空间的目录中执行以下命令:

mvn archetype:generate -DgroupId=com.javacodegeeks.example -DartifactId=jcg-elasticsearch-example -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

如果您是第一次运行maven,则完成生成命令将花费几秒钟,因为maven必须下载所有必需的插件和工件才能完成生成任务。

请注意,现在,您将在所选目录中拥有一个与artifactId同名的新目录。 现在,随时在您喜欢的IDE中打开项目。

4. Maven依赖

首先,我们需要在项目中添加适当的Maven依赖项。 我们将以下依赖项添加到我们的pom.xml文件中:

pom.xml

<properties><elasticsearch.version>6.1.2</elasticsearch.version><jackson.version>2.9.4</jackson.version><java.version>1.8</java.version>
</properties><dependencies><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>${elasticsearch.version}</version></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>${elasticsearch.version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>${jackson.version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>${jackson.version}</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency>
</dependencies>

在此处找到最新的Elasticsearch依赖项。

请注意,我们在代码中仅将Jackson用作Java的标准JSON库。

5.进行数据库查询

现在,我们准备开始构建项目并向其中添加更多组件。

5.1建立模型

我们将在我们的项目中添加一个非常简单的模型,即Person。 它的定义将非常标准,例如:

人.java

public class Person {private String personId;private String name;//standard getters and setters@Overridepublic String toString() {return String.format("Person{personId='%s', name='%s'}", personId, name);}
}

为了简洁起见,我们省略了标准的getter和setter方法,但是由于Jackson在对象的序列化和反序列化过程中使用它们,因此必须将它们制成。

5.2定义连接参数

我们将使用默认的连接参数与Elasticsearch建立连接。 默认情况下,ES使用两个端口:9200和9201。

连接参数

//The config parameters for the connection
private static final String HOST = "localhost";
private static final int PORT_ONE = 9200;
private static final int PORT_TWO = 9201;
private static final String SCHEME = "http";private static RestHighLevelClient restHighLevelClient;
private static ObjectMapper objectMapper = new ObjectMapper();private static final String INDEX = "persondata";
private static final String TYPE = "person";

除了连接配置参数外,我们还在上面定义了索引参数,以标识我们的Person数据的存储位置。

如以上参数所述,Elasticsearch使用两个端口9200和9201。第一个端口9200由Elasticsearch Query Server使用,我们可以使用它们通过RESTful API直接查询数据库。 REST服务器使用第二个端口9201 ,外部客户端可以通过该端口连接并执行操作。

5.3建立连接

我们将提供一种方法来建立与Elasticsearch数据库的连接。 与数据库建立连接时,我们必须提供两个端口,因为只有这样,我们的应用程序才能连接到Elasticsearch服务器,并且我们将能够执行数据库操作。 这是建立连接的代码:

用于获取连接对象的Singleton方法

/*** Implemented Singleton pattern here* so that there is just one connection at a time.* @return RestHighLevelClient*/
private static synchronized RestHighLevelClient makeConnection() {if(restHighLevelClient == null) {restHighLevelClient = new RestHighLevelClient(RestClient.builder(new HttpHost(HOST, PORT_ONE, SCHEME),new HttpHost(HOST, PORT_TWO, SCHEME)));}return restHighLevelClient;
}

请注意,我们在此处实现了Singleton Design模式 ,这样就不会为ES建立多个连接,从而节省了大量内存。

由于存在RestHighLevelClient ,因此与Elasticsearch的连接是线程安全的。 初始化此连接的最佳时间是在应用程序请求或向客户端发出第一个请求时。 初始化此连接客户端后,即可用于执行任何受支持的API。

5.4关闭连接

就像在旧版本的Elasticsearch中一样,我们使用TransportClient并在完成查询后将其关闭,并且在数据库与RestHighLevelClient的交互完成后也需要关闭连接。 这是可以做到的:

紧密连接

private static synchronized void closeConnection() throws IOException {restHighLevelClient.close();restHighLevelClient = null;
}

我们还为RestHighLevelClient对象分配了null,以便Singleton模式可以保持一致。

5.5插入数据

通过将键和值转换为Hashmap,可以将数据插入数据库。 ES数据库仅接受HashMap形式的值。 让我们看一下如何实现这一点的代码片段:

POST查询

private static Person insertPerson(Person person){person.setPersonId(UUID.randomUUID().toString());Map<String, Object> dataMap = new HashMap<String, Object>();dataMap.put("personId", person.getPersonId());dataMap.put("name", person.getName());IndexRequest indexRequest = new IndexRequest(INDEX, TYPE, person.getPersonId()).source(dataMap);try {IndexResponse response = restHighLevelClient.index(indexRequest);} catch(ElasticsearchException e) {e.getDetailedMessage();} catch (java.io.IOException ex){ex.getLocalizedMessage();}return person;
}

上面,我们还使用Java的UUID类来创建对象的唯一标识符。 这样,我们可以控制如何制作对象的标识符。

5.6发出GET请求

将数据插入数据库后,我们可以通过向Elasticsearch数据库服务器发出GET请求来确认操作。 让我们看一下如何做到这一点的代码片段:

GET查询

private static Person getPersonById(String id){GetRequest getPersonRequest = new GetRequest(INDEX, TYPE, id);GetResponse getResponse = null;try {getResponse = restHighLevelClient.get(getPersonRequest);} catch (java.io.IOException e){e.getLocalizedMessage();}return getResponse != null ?objectMapper.convertValue(getResponse.getSourceAsMap(), Person.class) : null;
}

在此查询中,我们仅提供了有关可用来识别对象的主要信息,即索引,类型及其唯一标识符。 同样,我们得到的实际上是一个值映射,如以下表达式所示:

获取地图

getResponse.getSourceAsMap()

实际上是Jackson的objectMapper,用于将该Map转换为可以在我们的程序中轻松使用的POJO Object,这样,我们不必每个Map都构成键,当您可以时,这将是一个繁琐的过程只是有一个POJO对象。

5.7更新数据

我们可以通过首先使用索引,类型和唯一标识符标识资源来轻松地向Elasticsearch发出更新请求。 然后,我们可以使用新的HashMap对象来更新Object中任意数量的值。 这是一个示例代码片段:

PUT查询

private static Person updatePersonById(String id, Person person){UpdateRequest updateRequest = new UpdateRequest(INDEX, TYPE, id).fetchSource(true);    // Fetch Object after its updatetry {String personJson = objectMapper.writeValueAsString(person);updateRequest.doc(personJson, XContentType.JSON);UpdateResponse updateResponse = restHighLevelClient.update(updateRequest);return objectMapper.convertValue(updateResponse.getGetResult().sourceAsMap(), Person.class);}catch (JsonProcessingException e){e.getMessage();} catch (java.io.IOException e){e.getLocalizedMessage();}System.out.println("Unable to update person");return null;
}

请注意以下语句中我们在上面所做的操作:

PUT查询

updateRequest.doc(personJson, XContentType.JSON);

在这里,我们没有传递需要更新的对象的任何特定属性,而是传递了完整的Object JSON,它将替换该对象存在的每个键。

我们还通过catch语句检查了任何可能的错误。 在实际的应用程序中,您将需要适当地处理这些错误并制作记录的日志。

5.8删除数据

最后,我们可以通过简单地用索引,类型和唯一标识符标识资源来删除数据。 让我们看一下如何做到这一点的代码片段:

删除查询

private static void deletePersonById(String id) {DeleteRequest deleteRequest = new DeleteRequest(INDEX, TYPE, id);try {DeleteResponse deleteResponse = restHighLevelClient.delete(deleteRequest);} catch (java.io.IOException e){e.getLocalizedMessage();}
}

同样,在上面的DELETE查询中,我们仅提到了如何识别对象。

5.9运行应用程序

让我们通过执行上面提到的所有操作来尝试我们的应用程序。 由于这是一个普通的Java应用程序,因此我们将调用以下每个方法并打印操作结果:

main()方法

public static void main(String[] args) throws IOException {makeConnection();System.out.println("Inserting a new Person with name Shubham...");Person person = new Person();person.setName("Shubham");person = insertPerson(person);System.out.println("Person inserted --> " + person);System.out.println("Changing name to `Shubham Aggarwal`...");person.setName("Shubham Aggarwal");updatePersonById(person.getPersonId(), person);System.out.println("Person updated  --> " + person);System.out.println("Getting Shubham...");Person personFromDB = getPersonById(person.getPersonId());System.out.println("Person from DB  --> " + personFromDB);System.out.println("Deleting Shubham...");deletePersonById(personFromDB.getPersonId());System.out.println("Person Deleted");closeConnection();
}

使用代码运行此应用程序后,将获得以下输出:

节目输出

Inserting a new Person with name Shubham...
Person inserted --> Person{personId='bfc5ba80-832a-4925-9b8d-525a4e420cb0', name='Shubham'}
Changing name to `Shubham Aggarwal`...
Unable to update person
Person updated --> Person{personId='bfc5ba80-832a-4925-9b8d-525a4e420cb0', name='Shubham Aggarwal'}
Getting Shubham...
Person from DB -->Person{personId='bfc5ba80-832a-4925-9b8d-525a4e420cb0', name='Shubham Aggarwal'}
Deleting Shubham...
Person Deleted

当然,ID可以有所不同。 请注意,在完成查询后,我们关闭了连接。 这有助于JVM收回由ES连接保留的内存。

六,结论

在本课程中,我们研究了如何将Elasticsearch与使用REST客户端的普通Java客户端一起使用。 需要使用一个可扩展的示例来探讨选择使用REST客户端使其在实际应用程序中可用。 这是我们开始构建应用程序时需要做出的选择。

在我们的Elasticsearch课程中进一步探索Elasticsearch 。

7.下载完整的源代码

这是有关ElasticSearch REST客户端和Java查询的教程,我们通过RESTful操作与Elasticsearch数据库进行了交互。

下载
您可以在此处下载此示例的完整源代码: Elasticsearch示例

翻译自: https://www.javacodegeeks.com/2018/03/elasticsearch-tutorial-beginners.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348181.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

博弈论与纳什均衡

三十分钟理解博弈论“纳什均衡” – Nash Equilibrium https://blog.csdn.net/xbinworld/article/details/50932559 纳什均衡(Nash equilibrium)及经典案例 https://blog.csdn.net/u010420283/article/details/83927742 论文&#xff1a; [1] 刘帅军. 卫星通信系统中动态资源…

Opnet入门

一、opnet快速入门 1.系统界面&文件菜单说明 2.常用文件名后缀及描述 3.Opnet建模层次 用户只有一种节点域模型 三、 OPNET Modeler网络仿真机制 1.事件的属性 每次点击next会出现以下界面&#xff1a; 2.事件的执行 调度型&#xff1a;按照正常程序调度事件 强制性&…

JSON的JUnit Hamcrest Matcher

这篇文章展示了如何编写JUnit测试来检查对象是否与JSON字符串匹配。 如果您要实现REST服务并想测试您的服务是否产生了预期的JSON响应&#xff0c;那么这一点很重要。 JSONassert是比较JSON对象的有用库。 首先&#xff0c;您必须将Java对象转换为JSON字符串&#xff08;例如&…

Python列表推导式

列表推导式 是Python构建列表&#xff08;list&#xff09;的一种快捷方式,可以使用简洁的代码就创建出一个列表&#xff0c;即循环创建列表. for可以用来创建列表&#xff0c;列表推导式就相当于是for循环的简化版 1. 最简单的情况 values [10, 21, 5, 7, 12] squares [] …

一些python函数及其用法

1.np.ravel&#xff08;&#xff09;方法 ravel是将数组维度拉成一维数组&#xff0c;也就是将矩阵向量化 x np.array{ [ [ 1 , 2 , 3 ] , [ 4 , 5 , 6 ] ] } print(np.ravel(x))输出 [ 1 2 3 4 5 6 ]2.b a[np.newaxis,:] import numpy as np a np.arange(0, 10) print(a…

使用Spring WebFlux进行操作

Spring Boot 2.0最近在GA上线了&#xff0c;所以我决定在相当长一段时间内写我的第一篇有关Spring的文章。 自发布以来&#xff0c;我已经看到越来越多的提到Spring WebFlux以​​及有关如何使用它的教程。 但是&#xff0c;在阅读完它们并尝试使它们自己工作之后&#xff0c;我…

【强化学习】Policy Gradient原理

1.Policy Gradient和DQN系列强化算法最大的区别在于&#xff1a; DQN系列基于Value&#xff0c;也就是说执行完所有的动作并保存所得到的价值&#xff0c;根据这些价值计算出最优价值函数&#xff0c;并以此选择动作&#xff0c;最终获得一个特定的策略。 Policy Gradient基于策…

ajax的url怎么将后缀补上_蜂蜜杏仁怎么做?杏仁和蜂蜜腌制方法

蜂蜜杏仁怎么做?杏仁和蜂蜜腌制方法蜂蜜杏仁是一种非常好吃的小零食&#xff0c;很多小可爱都喜欢吃蜂蜜杏仁。不过有些时候忘记补货&#xff0c;就会断粮&#xff0c;于是大家都想要在家里自制蜂蜜杏仁。不过你知道蜂蜜杏仁应该怎么做吗?蜂蜜杏仁的做法其实并不难&#xff0…

【强化学习】Policy Gradients代码注释版本

import gym # import tensorflow as tf import numpy as np# Hyper Parameters GAMMA 0.95 # discount factor 折扣因子 LEARNING_RATE 0.01 # 学习率class Policy_Gradient():# 咱们来搞一下大头&#xff01;def __init__(self, env): # 初始化# 先初始化一些参量sel…

c语言构建栈_选择技术栈构建通用平台

c语言构建栈Java社区中有许多关于Spring vs Java EE的话题。 一群人会争辩说您应该使用一个而不是其他。等等。当我看到这一点时&#xff0c;我不禁要想为什么我们不能同时使用它们呢&#xff1f; 实际上&#xff0c;我认为有效地使用它们将为建立基础架构创建一个伟大的技术堆…

【强化学习】Actor Critic原理

PG算法是一种只基于policy的一种方法&#xff0c;存在的问题就是该算法需要完整的状态序列&#xff0c;且单独对策略函数进行迭代更新&#xff0c;不太容易收敛。 Actor-critic方法呢是一种将 策略(Policy Based)和价值(Value Based)相结合的方法。下面继续来理一下AC方法的思路…

Java 9:对Process API的增强

Java 9对Process API进行了各种改进&#xff0c;用于控制和管理操作系统进程。 获取有关流程的信息 有一个新的ProcessHandle类&#xff0c;提供了进程的pid&#xff0c;父级和后代&#xff0c;以及有关开始时间和累积CPU时间的信息。 jshell> Process p new ProcessBui…

【强化学习】AC注释版本

## 强化学习 Actor-critic # 和PG比起来主要的变化&#xff1a; # 评估点由状态价值变成了TD_error,网络形式变了 # learn函数长得不一样 # action有一个优化函数&#xff0c;优化的是价值函数&#xff0c;希望最大化期望的reward&#xff0c;Critic网络也有一个reward&#xf…

python中sorted的用法append_Python中高阶函数sorted()用法

在Python中&#xff0c;有内置的排序方法&#xff1a;sorted(iterable, key, reverse)。Sorted()函数也是一个高阶函数&#xff0c;它还可以接收一个key函数来实现自定义的排序。key指定的函数将作用于list的每一个元素上&#xff0c;并根据key函数返回的结果进行排序。print(s…

【强化学习】A3C原理

先解释一下什么叫异步、什么叫并发&#xff1a; **异步&#xff1a;**和同步相对&#xff0c;同步是顺序执行&#xff0c;而异步是彼此独立&#xff0c;在等待某个事件的过程中继续做自己的事&#xff0c;不要等待这一事件完成后再工作。线程是实现异步的一个方式&#xff0c;异…

天玑机器人颈椎_天玑骨科手术机器人亮相机器人大会 误差不到1毫米

千龙网北京8月22日讯(记者 詹婷婷)8月23日-27日&#xff0c;年度科技盛典--2017年世界机器人大会将登陆北京亦创国际会展中心。100多家国内外机器人顶尖企业将携手机器人亮相。大会期间将秀出人工智能系统、特种机器人、服务机器人、工业机器人以及智慧家居机器人等先进产品。参…

jboss eap 7.0_创建委托登录模块(用于JBoss EAP 6.1)

jboss eap 7.0[如果只想查看代码&#xff0c;请向下滚动] 动机 在RHQ中&#xff0c;我们需要一个安全域&#xff0c;该域可用于通过容器管理的安全性来保护REST-api及其Web应用程序。 过去&#xff0c;我只是使用经典的DatabaseServerLoginModule对DatabaseServerLoginModule进…

cdn简单理解_简单地聊聊CDN原理作用及实现方法

释放双眼&#xff0c;带上耳机&#xff0c;听听看~&#xff01;相信只要会网上冲浪的都会接触到CDN吧&#xff0c;今天我们来聊聊对CDN的理解&#xff0c;给大家作为参考&#xff0c;本文将会以简单的描述来解释相关原理&#xff0c;供大家理解&#xff0c;希望相关专业同学进行…

JDK 10:FutureTask获取一个toString()

我已经有很长时间了&#xff0c;对于大多数具有独特属性的Java类&#xff0c;开发人员应该花时间重写Object.toString&#xff08;&#xff09; &#xff0c;即使它只是通过IDE生成的实现或使用诸如Apache之类的库类来实现Commons Lang的ToStringBuilder 。 如果要手动实现toSt…

【强化学习】A3C代码注释版本

########################################## # A3C做出的改进&#xff1a; # 解决AC难以收敛的问题 # 不一样的地方&#xff1a; #import threading # import tensorflow as tf import tensorflow.compat.v1 as tftf.compat.v1.disable_eager_execution() import numpy as np …