elastic search java_在 Java 应用程序中使用 Elasticsearch

如果您使用过 Apache Lucene 或 Apache Solr,就会知道它们的使用体验非常有趣。尤其在您需要扩展基于 Lucene 或 Solr 的解决方案时,您就会了解 Elasticsearch 项目背后的动机。Elasticsearch(构建于 Lucene 之上)在一个容易管理的包中提供了高性能的全文搜索功能,支持开箱即用地集群化扩展。您可以通过标准的 REST API 或从特定于编程语言的客户端库与 Elasticsearch 进行交互。

本教程将展示 Elasticsearch 的实际工作原理。首先从命令行访问该 REST API 来了解它的基本信息。然后设置一个本地 Elasticsearch 服务器,并从一个简单的 Java 应用程序与它交互。您可以获取示例代码。

前提条件

要理解本教程的所有示例,需要在您的系统上安装 Elasticsearch。下载针对您的平台的 最新 Elastic Search 程序包 。将该包解压到一个方便的位置。在 UNIX 或 Linux 上,通过以下命令启动该实例:

/elastic-search-dir/bin/elasticsearchShow moreShow more icon

在 Windows 上,运行

/elastic-search-dir/bin/elasticsearch.batShow moreShow more icon

在看到日志消息 started 时,该节点已准备好接受请求。

对于 Java 示例,还需要安装 Eclipse 和 Apache Maven 。如果您的系统上还没有它们,请下载和安装它们。

您还需要 cURL。在 Microsoft Windows 上,我使用 Git Bash shell 来运行 cURL。

使用 cURL 执行 REST 命令

可以对 Elasticsearch 发出 cURL 请求,这样很容易从命令行 shell 体验该框架。

Elasticsearch 是无模式的。它可以接受您提供的任何命令,并处理它以供以后查询。

Elasticsearch 是无模式的,这意味着它可以接受您提供的任何命令,并处理它以供以后查询。Elasticsearch 中的所有内容都被存储为 文档 ,所以您的第一个练习是存储一个包含歌词的文档。首先创建一个 索引 ,它是您的所有文档类型的容器 — 类似于 MySQL 等关系数据库中的数据库。然后,将一个文档插入该索引中,以便可以查询该文档的数据。

创建一个索引

Elasticsearch 命令的一般格式是: REST VERB HOST_:9200/ _index_ / _doc-type — 其中 REST VERB 是 PUT 、 GET 或 DELETE 。(使用 cURL -X 动词前缀来明确指定 HTTP 方法。)

要创建一个索引,可在您的 shell 中运行以下命令:

curl -XPUT "http://localhost:9200/music/"Show moreShow more icon

模式可选

尽管 Elasticsearch 是无模式的,但它在幕后使用了 Lucene,后者使用了模式。不过 Elasticsearch 为您隐藏了这种复杂性。实际上,您可以将 Elasticsearch 文档类型简单地视为子索引或表名称。但是,如果您愿意,可以指定一个模式,所以您可以将它视为一种模式可选的数据存储。

插入一个文档

要在 /music 索引下创建一个类型,可插入一个文档。在第一个示例中,您的文档包含数据(包含一行)”Deck the Halls” 的歌词,这是一首最初由威尔士诗人 John Ceirog Hughes 于 1885 年编写的传统的圣诞歌曲。

要将包含 “Deck the Halls” 的文档插入索引中,可运行以下命令(将该命令和本教程的其他 cURL 命令都键入到一行中):

curl -XPUT "http://localhost:9200/music/songs/1" -d '

{ "name": "Deck the Halls", "year": 1885, "lyrics": "Fa la la la la" }'Show moreShow more icon

前面的命令使用 PUT 动词将一个文档添加到 /songs 文档类型,并为该文档分配 ID 1。URL 路径显示为 index/doctype/ID 。

查看文档

要查看该文档,可使用简单的 GET 命令:

curl -XGET "http://localhost:9200/music/songs/1"Show moreShow more icon

Elasticsearch 使用您之前 PUT 进索引中的 JSON 内容作为响应:

{"_index":"music","_type":"songs","_id":"1","_version":1,"found":true,"_source":

{ "name": "Deck the Halls", "year": 1885, "lyrics": "Fa la la la la" }}Show moreShow more icon

更新文档

如果您认识到日期写错了,并想将它更改为 1886 怎么办?可运行以下命令来更新文档:

curl -XPUT "http://localhost:9200/music/lyrics/1" -d '{ "name":

"Deck the Halls", "year": 1886, "lyrics": "Fa la la la la" }'Show moreShow more icon

因为此命令使用了相同的唯一 ID 1,所以该文档会被更新。

删除文档(但暂时不要删除)

暂时不要删除该文档,知道如何删除它就行了:

curl -XDELETE "http://localhost:9200/music/lyrics/1"Show moreShow more icon

从文件插入文档

这是另一个技巧。您可以使用一个文件的内容来从命令行插入文档。尝试此方法,添加另一首针对传统歌曲 “Ballad of Casey Jones” 的文档。将清单 1 复制到一个名为 caseyjones.json 的文件中;也可以使用示例代码包中的 caseyjones.json 文件。将该文件放在任何方便对它运行 cURL 命令的地方。(在下载的代码中,该文件位于根目录中。)

清单 1. “Ballad of Casey Jones” 的 JSON 文档

{

"artist": "Wallace Saunders",

"year": 1909,

"styles": ["traditional"],

"album": "Unknown",

"name": "Ballad of Casey Jones",

"lyrics": "Come all you rounders if you want to hear

The story of a brave engineer

Casey Jones was the rounder's name....

Come all you rounders if you want to hear

The story of a brave engineer

Casey Jones was the rounder's name

On the six-eight wheeler, boys, he won his fame

The caller called Casey at half past four

He kissed his wife at the station door

He mounted to the cabin with the orders in his hand

And he took his farewell trip to that promis'd land

Chorus:

Casey Jones--mounted to his cabin

Casey Jones--with his orders in his hand

Casey Jones--mounted to his cabin

And he took his... land"

}Show moreShow more icon

运行以下命令,将此文档 PUT 到您的 music 索引中:

$ curl -XPUT "http://localhost:9200/music/lyrics/2" -d @caseyjones.jsonShow moreShow more icon

在该索引中时,将清单 2 的内容(包含另一手民歌 “Walking Boss”)保存到 walking.json 文件中。

清单 2. “Walking Boss” JSON

{

"artist": "Clarence Ashley",

"year": 1920

"name": "Walking Boss",

"styles": ["folk","protest"],

"album": "Traditional",

"lyrics": "Walkin' boss

Walkin' boss

Walkin' boss

I don't belong to you

I belong

I belong

I belong

To that steel driving crew

Well you work one day

Work one day

Work one day

Then go lay around the shanty two"

}Show moreShow more icon

将此文档推送到索引中:

$ curl -XPUT "http://localhost:9200/music/lyrics/3" -d @walking.jsonShow moreShow more icon

搜索 REST API

是时候运行一次基本查询了,此查询比您运行来查找 “Get the Halls” 文档的简单 GET 要复杂一些。文档 URL 有一个内置的 _search 端点用于此用途。在歌词中找到所有包含单词 you 的歌曲:

curl -XGET "http://localhost:9200/music/lyrics/_search?q=lyrics:'you'"Show moreShow more icon

q 参数表示一个查询。

响应是:

{"took":107,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":2,"max

_score":0.15625,"hits":[{"_index":"music","_type":"songs","_id":"2","_

score":0.15625,"_source":{"artist": "Wallace Saunders","year": 1909,"styles":

["traditional"],"album": "Unknown","name": "Ballad of Casey Jones","lyrics": "Come all you rounders

if you want to hear The story of a brave engineer Casey Jones was the rounder's name.... Come all

you rounders if you want to hear The story of a brave engineer Casey Jones was the rounder's name

On the six-eight wheeler, boys, he won his fame The caller called Casey at half past four He kissed

his wife at the station door He mounted to the cabin with the orders in his hand And he took his

farewell trip to that promis'd land Chorus: Casey Jones--mounted to his cabin Casey Jones--with his

orders in his hand Casey Jones--mounted to his cabin And he took his... land"

}},{"_index":"music","_type":"songs","_id":"3","_score":0.06780553,"_source":{"artist": "Clarence

Ashley","year": 1920,"name": "Walking Boss","styles": ["folk","protest"],"album":

"Traditional","lyrics": "Walkin' boss Walkin' boss Walkin' boss I don't belong to you I belong I

belong I belong To that steel driving crew Well you work one day Work one day Work one day Then go

lay around the shanty two"}}]}}Show moreShow more icon

使用其他比较符

还有其他各种比较符可供使用。例如,找到所有 1900 年以前编写的歌曲:

curl -XGET "http://localhost:9200/music/lyrics/_search?q=year:<1900Show moreShow more icon

此查询将返回完整的 “Casey Jones” 和 “Walking Boss” 文档。

限制字段

要限制您在结果中看到的字段,可将 fields 参数添加到您的查询中:

curl -XGET "http://localhost:9200/music/lyrics/_search?q=year:>1900&fields=year"Show moreShow more icon

检查搜索返回对象

清单 3 给出了 Elasticsearch 从前面的查询返回的数据。

清单 3. 查询结果

{

"took": 6,

"timed_out": false,

"_shards": {

"total": 5,

"successful": 5,

"failed": 0

},

"hits": {

"total": 2,

"max_score": 1.0,

"hits": [{

"_index": "music",

"_type": "lyrics",

"_id": "1",

"_score": 1.0,

"fields": {

"year": [1920]

}

}, {

"_index": "music",

"_type": "lyrics",

"_id": "3",

"_score": 1.0,

"fields": {

"year": [1909]

}

}]

}

}Show moreShow more icon

在结果中,Elasticsearch 提供了多个 JSON 对象。第一个对象包含请求的元数据:看看该请求花了多少毫秒 (took) 和它是否超时 (timed_out)。 _shards 字段需要考虑 Elasticsearch 是一个集群化服务的事实。甚至在这个单节点本地部署中,Elasticsearch 也在逻辑上被集群化为分片。

继续查看清单 3 中的搜索结果,可以观察到 hits 对象包含:

total 字段,它会告诉您获得了多少个结果

max_score ,用于全文搜索

实际结果

实际结果包含 fields 属性,因为您将 fields 参数添加到了查询中。否则,结果中会包含 source ,而且包含完整的匹配文档。 _index 、 _type 和 _id 的用途不言自明; _score 指的是全文搜索命中长度。这 4 个字段始终会在结果中返回。

使用 JSON 查询 DSL

基于查询字符串的搜索很快会变得很复杂。对于更高级的查询,Elasticsearch 提供了一种完全基于 JSON 的特定于领域的语言 (DSL)。例如,要搜索 album 值为 traditional 的每首歌曲,可创建一个包含以下内容的 query.json 文件:

{

"query" : {

"match" : {

"album" : "Traditional"

}

}

}Show moreShow more icon

然后运行:

curl -XGET "http://localhost:9200/music/lyrics/_search" -d @query.jsonShow moreShow more icon

从 Java 代码使用 Elasticsearch

Elasticsearch 强大功能会在通过语言 API 使用它时体现出来。

Elasticsearch 强大功能会在通过语言 API 使用它时体现出来。现在我将介绍 Java API,您将从一个应用程序执行搜索。请参见 下载 部分,获取相关的示例代码。该应用程序使用了 Spark 微型框架,所以可以很快设置它。

示例应用程序

为一个新项目创建一个目录,然后运行(将该命令键入到一行上):

mvn archetype:generate -DgroupId=com.dw -DartifactId=es-demo

-DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=falseShow moreShow more icon

要生成一个项目来在 Eclipse 中使用,可通过 cd 进入 Maven 创建的项目目录,并运行 mvn eclipse:eclipse 。

在 Eclipse 中,选择 File > Import > Existing Project into Workspace 。导航到您使用 Maven 的文件夹,选择该项目,单击 Finish 。

在 Eclipse 中,您可以看到一个基本的 Java 项目布局,包括根目录中的 pom.xml 文件和一个 com.dw.App.java 主要类文件。将您所需的依赖项添加到 pom.xml 文件中。清单 4 给出了完整的 pom.xml 文件。

清单 4. 完整的 pom.xml

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

4.0.0

com.dw

es-demo

jar

1.0-SNAPSHOT

es-demo

http://maven.apache.org

org.apache.maven.plugins

maven-compiler-plugin

1.8

1.8

1.8

com.sparkjava

spark-core

2.3

com.sparkjava

spark-template-freemarker

2.3

org.elasticsearch

elasticsearch

2.1.1

Show moreShow more icon

清单 4 中的依赖项获取 Spark 框架核心、Spark Freemarker 模板支持和 Elasticsearch。另请注意,我将 版本设置为 Java 8,Spark 需要该版本(因为它大量使用了 lambda)。

我不知道您的情况,但我不久前构建了许多 RESTful 应用程序,所以为了改变以下步调,您将为应用程序提供一个更加传统的 “提交和加载 (submit-and-load)” UI。

在 Eclipse 中,在导航器中右键单击项目,选择 Configure > Convert to Maven Project ,以便 Eclipse 可以解析 Maven 依赖项。转到项目,右键单击该项目,然后选择 Maven > Update Project 。

Java 客户端配置

Elasticsearch 的 Java 客户端非常强大;它可以建立一个嵌入式实例并在必要时运行管理任务。但我在这里将重点介绍如何运行针对您已运行的节点的应用程序任务。

运行一个 Java 应用程序和 Elasticsearch 时,有两种操作模式可供使用。该应用程序可在 Elasticsearch 集群中扮演更加主动或更加被动的角色。在更加主动的情况下(称为 Node Client),应用程序实例将从集群接收请求,确定哪个节点应处理该请求,就像正常节点所做的一样。(应用程序甚至可以托管索引和处理请求。)另一种模式称为 Transport Client,它将所有请求都转发到另一个 Elasticsearch 节点,由后者来确定最终目标。

获取 Transport Client

对于演示应用程序,(通过 App.java 中执行的初始化)选择 Transport Client,并保持 Elasticsearch 执行最低级别的处理:

Client client = TransportClient.builder().build()

.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));Show moreShow more icon

如果连接到一个 Elasticsearch 集群,构建器可以接受多个地址。(在本例中,您只有一个 localhost 节点。)连接到端口 9300,而不是像之前在 REST API 的 cURL 中一样连接到 9200。Java 客户端将会使用这个特殊端口,使用端口 9200 不起作用。(其他 Elasticsearch 客户端,Python 客户端就是其中之一,将会 使用 9200 来访问 REST API。)

在服务器启动时创建该客户端,并在整个请求处理过程中使用它。Spark 通过 Mustache 模板引擎的 Java 实现来呈现该页面,而且 Spark 定义了请求端点 — 但我不会太多地解释这些简单的用例。(请参见 参考资料 ,获取 Spark 的详细信息的链接。)

该应用程序的索引页面显示了 Java 客户端的功能:

48c94272b9e5b476e998d7aacb30b135.png

UI:

呈现现有歌曲的列表

提供一个添加歌曲的按钮

实现按艺术家和歌词进行搜索

返回突出显示了匹配内容的结果

搜索和处理结果

在清单 5 中,根 URL / 被映射到 index.mustache 页面。

清单 5. 基本搜索

Spark.get("/", (request, response) -> {

SearchResponse searchResponse =

client.prepareSearch("music").setTypes("lyrics").execute().actionGet();

SearchHit[] hits = searchResponse.getHits().getHits();

Map attributes = new HashMap<>();

attributes.put("songs", hits);

return new ModelAndView(attributes, "index.mustache");

}, new MustacheTemplateEngine());Show moreShow more icon

清单 5 中的有趣部分始于:

SearchResponse searchResponse = client.prepareSearch("music").setTypes("lyrics").execute().actionGet();Show moreShow more icon

这一行显示了搜索 API 的简单用法。使用 prepareSearch 方法指定一个索引(在本例中为 music ),然后执行查询。查询基本上显示为 “Give me all of the records in the music index.”。另外,将文档类型设置为 lyrics ,但在这个简单用例中没有必要这么做,因为索引仅包含一种文档类型。在更大的应用程序,需要执行这种设置。这个 API 调用类似于您之前看到的 curl -XGET "http://localhost:9200/music/lyrics/_search" 调用。

SearchResponse 对象包含有趣的功能(例如命中数量和评分),但就目前而言,您只想要一个结果数组,可使用 searchResponse.getHits().getHits(); 获得它。

最后,将结果数组添加到视图上下文中,并让 Mustache 呈现它。Mustache 模板如下所示:

清单 6. index.mustache

Search

Add

{{#songs}}

{{id}} - {{getSource.name}} - {{getSource.year}}

{{#getHighlightFields}} -

{{#lyrics.getFragments}}

{{#.}}{{{.}}}{{/.}}

{{/lyrics.getFragments}}

{{/getHighlightFields}}

{{/songs}}

Show moreShow more icon

突出显示高级查询和匹配内容

要支持突出显示更高级的查询和匹配内容,可以使用 /search ,如下所示:

清单 7. 搜索和突出显示

Spark.get("/search", (request, response) -> {

SearchRequestBuilder srb = client.prepareSearch("music").setTypes("lyrics");

String lyricParam = request.queryParams("query");

QueryBuilder lyricQuery = null;

if (lyricParam != null && lyricParam.trim().length() > 0){

lyricQuery = QueryBuilders.matchQuery("lyrics", lyricParam);

}

String artistParam = request.queryParams("artist");

QueryBuilder artistQuery = null;

if (artistParam != null && artistParam.trim().length() > 0){

artistQuery = QueryBuilders.matchQuery("artist", artistParam);

}

if (lyricQuery != null && artistQuery == null){

srb.setQuery(lyricQuery).addHighlightedField("lyrics", 0, 0);

} else if (lyricQuery == null && artistQuery != null){

srb.setQuery(artistQuery);

} else if (lyricQuery != null && artistQuery != null){

srb.setQuery(QueryBuilders.andQuery(artistQuery,

lyricQuery)).addHighlightedField("lyrics", 0, 0);

}

SearchResponse searchResponse = srb.execute().actionGet();

SearchHit[] hits = searchResponse.getHits().getHits();

Map attributes = new HashMap<>();

attributes.put("songs", hits);

return new ModelAndView(attributes, "index.mustache");

}, new MustacheTemplateEngine());Show moreShow more icon

在清单 7 中,要注意的第一个有趣的 API 用法是 QueryBuilders.matchQuery("lyrics", lyricParam); 。这是您设置对 lyrics 字段的查询的地方。另外要注意的是 QueryBuilders.andQuery(artistQuery, lyricQuery) ,它是将查询的 artist 和 lyrics 部分合并到 AND 查询中的一种方法。

.addHighlightedField("lyrics", 0, 0); 调用告诉 Elasticsearch 生成 lyrics 字段上的搜索命中突出显示结果。第二和第三个参数分别指定无线大小的分段和无限数量的分段。

在呈现搜索结果时,将突出显示结果放入 HTML 中。使用 Elasticsearch 就能生成有效的 HTML,使用 标记来突出显示匹配字符串所在的位置。

插入文档

让我们来看看如何以编程方式将文档插入索引中。清单 8 给出了添加过程。

清单 8. 插入索引中

Spark.post("/save", (request, response) -> {

StringBuilder json = new StringBuilder("{");

json.append("\"name\":\""+request.raw().getParameter("name")+"\",");

json.append("\"artist\":\""+request.raw().getParameter("artist")+"\",");

json.append("\"year\":"+request.raw().getParameter("year")+",");

json.append("\"album\":\""+request.raw().getParameter("album")+"\",");

json.append("\"lyrics\":\""+request.raw().getParameter("lyrics")+"\"}");

IndexRequest indexRequest = new IndexRequest("music", "lyrics",

UUID.randomUUID().toString());

indexRequest.source(json.toString());

IndexResponse esResponse = client.index(indexRequest).actionGet();

Map attributes = new HashMap<>();

return new ModelAndView(attributes, "index.mustache");

}, new MustacheTemplateEngine());Show moreShow more icon

使用 StringBuilder 直接生成一个 JSON 字符串来创建它。在生产应用程序中,可使用 Boon 或 Jackson 等库。

执行 Elasticsearch 工作的部分是:

IndexRequest indexRequest = new IndexRequest("music", "lyrics", UUID.randomUUID().toString());Show moreShow more icon

在本例中,使用了 UUID 来生成 ID。

结束语

您已快速掌握了如何从命令行和在 Java 应用程序中使用 Elasticsearch。您现在已经熟悉了索引、查询、突出显示和多字段搜索。Elasticsearch 在一个相对容易使用的包中提供了大量的功能。作为一个项目,Elasticsearch 带来了一些您可能也会感兴趣的结果。具体地讲,所谓的 ELK 堆栈,即 Elasticsearch、Logstash(用于日志管理)和 Kibana(用于报告/可视化),正在迅速发展。

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

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

相关文章

PostgreSQL增强版命令行客户端(pgcli)

效果&#xff1a; 安装&#xff1a; https://www.pgcli.com/install 官网&#xff1a; https://www.pgcli.com/ 转载于:https://www.cnblogs.com/EasonJim/p/9042418.html

网络设备的注册与初始化

2019独角兽企业重金招聘Python工程师标准>>> NIC可用之前&#xff0c;其相关联的net_device数据结构必须先初始化&#xff0c;添加到内核网络设备数据库、配置并开启。不要把注册/除名以及开启/关闭混淆是十分重要的&#xff0c;这是两种不同的概念&#xff1a; 如果…

[转]敏捷开发中编写高质量Java代码

本文转自&#xff1a;http://dev.yesky.com/103/11164603.shtml 敏捷开发的理念已经流行了很长的时间&#xff0c;在敏捷开发中的开发迭代阶段中&#xff0c;我们可以通过五个步骤&#xff0c;来有效的提高整个项目的代码质量。 Java项目开发过程中&#xff0c;由于开发人员的…

ios3怎么取消长按弹出菜单_苹果:iOS13取消3D-Touch重压改为长按只是个BUG~

原标题&#xff1a;苹果&#xff1a;iOS13取消3D-Touch重压改为长按只是个BUG~目前iOS 13中3D-Touch功能在桌面级菜单采用的是类似iPhone XR的触觉感应(Haptic touch)&#xff0c;用户只需要长按App图标即可呼出菜单&#xff0c;继续长按则会出现删除应用的抖动界面。不同于以往…

设△ABC的内角A,B,C,所对的边分别为a,b,c,且acosB-bcosA=3/5c,则tan(A-B)的最大值为

设△ABC的内角A,B,C,所对的边分别为a,b,c,且acosB-bcosA3/5c,则tan(A-B)的最大值为 转载于:https://www.cnblogs.com/Mary-Sue/p/9048289.html

BGP笔记1

1、BGP属于EGP&#xff0c;是高级DV协议&#xff0c;也被称为路径矢量协议&#xff0c;基于TCP 179端口。 2、现在使用版本BGP-4。 3、第一次做完整更新&#xff0c;以后就只增量更新 4、Autonomous Systems&#xff1a;运行同一种选路策略&#xff0c;由统一管理者管理。 1&am…

也说读书

记得当年毕业前夕&#xff0c;一位教授说&#xff1a;“希望你们毕业后&#xff0c;能坚持每年读10本书。”当时不以为然&#xff0c;区区十本&#xff0c;岂非小菜&#xff01;毕业后&#xff0c;迫于生计&#xff0c;东奔西走&#xff0c;很难静心读书&#xff0c;偶尔拿起书…

C# 巧用anchor和dock设计复杂界面(控件随着窗体大小的变化而变化)【转】

这个在做winform程序的空间编程的时候遇到过太多次了&#xff0c;自己也想留下点经验&#xff0c;搜索了一下&#xff0c;这篇文章很好很强大了&#xff0c;感谢博主“驴子的菜园”。 程序界面如上 各部分简要说明&#xff1a; 整个窗体上覆盖一个splitcontainer。 splitcontai…

mysql内链接与交叉连接_SQLServer 2008中的交叉连接与内部连接

这里是交叉连接和内部连接的最佳示例。考虑下表表&#xff1a;Teacherx------------------------x| TchrId | TeacherName |x----------|-------------x| T1 | Mary || T2 | Jim |x------------------------x表&#xff1a;Studentx-------------…

jmeter java接口_JMeter接口Java开发五步曲

想做jmeter接口二次开发但不知道如何入手&#xff0c;要解决这个问题&#xff0c;我们可以分为5个步骤第一步&#xff1a;了解jmeter处理java请求的流程第二步&#xff1a;通过实现jmeter中的接口JavaSamplerClient编写自定义JAVA接口第三步&#xff1a;打包第四步&#xff1a;…

@ConfigurationProperties和@Value不同的使用场景,@Bean添加组件 (6.spring boot配置文件注入)...

接上文 注释掉ConfigurationProperties使用Value注解 /*** <bean class"Person">* <property name"lastName" value"字面量/${key}从环境变量、配置文件中获取值/#{spel}"></property>* <bean/>*/ //Spring底层注解…

java继承孙子类_Java:类与继承

Java&#xff1a;类与继承对于面向对象的程序设计语言来说&#xff0c;类毫无疑问是其最重要的基础。抽象、封装、继承、多态 这四大特性都离不开类&#xff0c;只有存在类&#xff0c;才能体现面向对象编程的特点&#xff0c;今天我们就来了解一些类与继承的相关知识。首先&am…

P2787 语文1(chin1)- 理理思维

题目背景 蒟蒻HansBug在语文考场上&#xff0c;挠了无数次的头&#xff0c;可脑子里还是一片空白。 题目描述 考试开始了&#xff0c;可是蒟蒻HansBug脑中还是一片空白。哦不&#xff01;准确的说是乱七八糟的。现在首要任务就是帮蒟蒻HansBug理理思维。假设HansBug的思维是一长…

使用jstree创建无限分级的树(ajax动态创建子节点)

首先来看一下效果 页面加载之初 节点全部展开后 首先数据库的表结构如下 其中Id为主键,PId为关联到自身的外键 两个字段均为GUID形式 层级关系主要靠这两个字段维护 其次需要有一个类型 public class MenuType{public Guid Id { get; set; }public Guid PId { get; set; }publi…

排序算法杂谈(三) —— 归并排序的非递归实现

1. 递归 在众多排序算法中&#xff0c;归并排序&#xff08;Merge Sort&#xff09;和快速排序&#xff08;Quick Sort&#xff09;都是时间复杂度为 O(nlog2n) 的高效排序。 这两种排序有一种共性&#xff0c;就是运用到了递归的思想。 在程序设计中&#xff0c;递归是一个很有…

【Canal源码分析】Sink及Store工作过程

一、序列图 二、源码分析 2.1 Sink Sink阶段所做的事情&#xff0c;就是根据一定的规则&#xff0c;对binlog数据进行一定的过滤。我们之前跟踪过parser过程的代码&#xff0c;发现在parser完成后&#xff0c;会把数据放到一个环形队列TransactionBuffer中&#xff0c;也就是这…

博客园修改页面显示样式css

博客园修改页面显示样式css 一、总结 二、 博客园修改页面显示样式css 1、点管理 2、点设置 3、在页面定制css代码中加入你想要改变样式的css代码即可 不会写css的下面有代码示例&#xff0c;直接复制粘贴放到页面定制css代码位置即可 三、代码 1 #cnblogs_post_body h3 {2 …

基准测试 ApacheBench ab学习

2019独角兽企业重金招聘Python工程师标准>>> ab的全称是ApacheBench&#xff0c;是 Apache 附带的一个小工具&#xff0c;专门用于 HTTP Server 的benchmark testing&#xff0c;可以同时模拟多个并发请求。前段时间看到公司的开发人员也在用它作一些测试&#xff0…

java虚拟机类加载机制浅谈_浅谈Java虚拟机(三)之类加载机制

在《浅谈Java虚拟机》这篇文章中&#xff0c;我们提到了JVM从操作系统方面来说&#xff0c;可以将其看做是一个进程&#xff0c;分别有类加载器子系统&#xff0c;执行引擎子系统和垃圾收集子系统。这一篇文章就简单的来谈一下类加载器子系统中的类加载机制。第一&#xff1a;什…

fedora 16 面部显示

为什么80%的码农都做不了架构师&#xff1f;>>> 显示日期&#xff1a; gsettings set org.gnome.shell.clock show-date true 显示秒数&#xff1a; gsettings set org.gnome.shell.clock show-seconds true 显示天气&#xff1a; 1.在这里 https://github.com/sim…