在 Java 应用程序中使用 Elasticsearch.docx
- 文档编号:5291424
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:14
- 大小:64.14KB
在 Java 应用程序中使用 Elasticsearch.docx
《在 Java 应用程序中使用 Elasticsearch.docx》由会员分享,可在线阅读,更多相关《在 Java 应用程序中使用 Elasticsearch.docx(14页珍藏版)》请在冰豆网上搜索。
在Java应用程序中使用Elasticsearch
如果您使用过Apache Lucene 或ApacheSolr,就会知道它们的使用体验非常有趣。
尤其在您需要扩展基于Lucene或Solr的解决方案时,您就会了解 Elasticsearch 项目背后的动机。
Elasticsearch(构建于Lucene之上)在一个容易管理的包中提供了高性能的全文搜索功能,支持开箱即用地集群化扩展。
您可以通过标准的 RESTAPI 或从特定于编程语言的客户端库与Elasticsearch进行交互。
本教程将展示Elasticsearch的实际工作原理。
首先从命令行访问该RESTAPI来了解它的基本信息。
然后设置一个本地Elasticsearch服务器,并从一个简单的Java应用程序与它交互。
请参见 下载 部分,获取有关的示例代码。
前提条件
要理解本教程的所有示例,需要在您的系统上安装Elasticsearch。
下载针对您的平台的 最新ElasticSearch程序包。
将该包解压到一个方便的位置。
在UNIX或Linux上,通过以下命令启动该实例:
/elastic-search-dir/bin/elasticsearch
在Windows上,运行
/elastic-search-dir/bin/elasticsearch.bat
在看到日志消息 started 时,该节点已准备好接受请求。
对于Java示例,还需要安装 Eclipse 和 ApacheMaven。
如果您的系统上还没有它们,请下载和安装它们。
您还需要cURL。
在MicrosoftWindows上,我使用 GitBash shell来运行cURL。
使用cURL执行REST命令
可以对Elasticsearch发出cURL请求,这样很容易从命令行shell体验该框架。
“Elasticsearch是无模式的。
它可以接受您提供的任何命令,并处理它以供以后查询。
”
Elasticsearch是无模式的,这意味着它可以接受您提供的任何命令,并处理它以供以后查询。
Elasticsearch中的所有内容都被存储为文档,所以您的第一个练习是存储一个包含歌词的文档。
首先创建一个索引,它是您的所有文档类型的容器—类似于MySQL等关系数据库中的数据库。
然后,将一个文档插入该索引中,以便可以查询该文档的数据。
创建一个索引
Elasticsearch命令的一般格式是:
RESTVERBHOST:
9200/index/doc-type—其中 RESTVERB 是 PUT、GET 或 DELETE。
(使用cURL -X 动词前缀来明确指定HTTP方法。
)
要创建一个索引,可在您的shell中运行以下命令:
curl-XPUT"http:
//localhost:
9200/music/"
模式可选
尽管Elasticsearch是无模式的,但它在幕后使用了Lucene,后者使用了模式。
不过Elasticsearch为您隐藏了这种复杂性。
实际上,您可以将Elasticsearch文档类型简单地视为子索引或表名称。
但是,如果您愿意,可以指定一个模式,所以您可以将它视为一种模式可选的数据存储。
插入一个文档
要在 /music 索引下创建一个类型,可插入一个文档。
在第一个示例中,您的文档包含数据(包含一行)“DecktheHalls”的歌词,这是一首最初由威尔士诗人JohnCeirogHughes于1885年编写的传统的圣诞歌曲。
要将包含“DecktheHalls”的文档插入索引中,可运行以下命令(将该命令和本教程的其他cURL命令都键入到一行中):
curl-XPUT"http:
//localhost:
9200/music/songs/1"-d'
{"name":
"DecktheHalls","year":
1885,"lyrics":
"Falalalala"}'
前面的命令使用 PUT 动词将一个文档添加到 /songs 文档类型,并为该文档分配ID1。
URL路径显示为 index/doctype/ID。
查看文档
要查看该文档,可使用简单的 GET 命令:
curl-XGET"http:
//localhost:
9200/music/songs/1"
Elasticsearch使用您之前 PUT 进索引中的JSON内容作为响应:
{"_index":
"music","_type":
"songs","_id":
"1","_version":
1,"found":
true,"_source":
{"name":
"DecktheHalls","year":
1885,"lyrics":
"Falalalala"}}
更新文档
如果您认识到日期写错了,并想将它更改为1886怎么办?
可运行以下命令来更新文档:
curl-XPUT"http:
//localhost:
9200/music/lyrics/1"-d'{"name":
"DecktheHalls","year":
1886,"lyrics":
"Falalalala"}'
因为此命令使用了相同的唯一ID1,所以该文档会被更新。
删除文档(但暂时不要删除)
暂时不要删除该文档,知道如何删除它就行了:
curl-XDELETE"http:
//localhost:
9200/music/lyrics/1"
从文件插入文档
这是另一个技巧。
您可以使用一个文件的内容来从命令行插入文档。
尝试此方法,添加另一首针对传统歌曲“BalladofCaseyJones”的文档。
将清单1复制到一个名为caseyjones.json的文件中;也可以使用示例代码包中的caseyjones.json文件(参见 下载)。
将该文件放在任何方便对它运行cURL命令的地方。
(在下载的代码中,该文件位于根目录中。
)
清单1.“BalladofCaseyJones”的JSON文档
{
"artist":
"WallaceSaunders",
"year":
1909,
"styles":
["traditional"],
"album":
"Unknown",
"name":
"BalladofCaseyJones",
"lyrics":
"Comeallyouroundersifyouwanttohear
Thestoryofabraveengineer
CaseyJoneswastherounder'sname....
Comeallyouroundersifyouwanttohear
Thestoryofabraveengineer
CaseyJoneswastherounder'sname
Onthesix-eightwheeler,boys,hewonhisfame
ThecallercalledCaseyathalfpastfour
Hekissedhiswifeatthestationdoor
Hemountedtothecabinwiththeordersinhishand
Andhetookhisfarewelltriptothatpromis'dland
Chorus:
CaseyJones--mountedtohiscabin
CaseyJones--withhisordersinhishand
CaseyJones--mountedtohiscabin
Andhetookhis...land"
}
运行以下命令,将此文档 PUT 到您的 music 索引中:
$curl-XPUT"http:
//localhost:
9200/music/lyrics/2"-d@caseyjones.json
在该索引中时,将清单2的内容(包含另一手民歌“WalkingBoss”)保存到walking.json文件中。
清单2.“WalkingBoss”JSON
{
"artist":
"ClarenceAshley",
"year":
1920
"name":
"WalkingBoss",
"styles":
["folk","protest"],
"album":
"Traditional",
"lyrics":
"Walkin'boss
Walkin'boss
Walkin'boss
Idon'tbelongtoyou
Ibelong
Ibelong
Ibelong
Tothatsteeldrivingcrew
Wellyouworkoneday
Workoneday
Workoneday
Thengolayaroundtheshantytwo"
}
将此文档推送到索引中:
$curl-XPUT"http:
//localhost:
9200/music/lyrics/3"-d@walking.json
搜索RESTAPI
是时候运行一次基本查询了,此查询比您运行来查找“GettheHalls”文档的简单 GET 要复杂一些。
文档URL有一个内置的 _search 端点用于此用途。
在歌词中找到所有包含单词 you 的歌曲:
curl-XGET"http:
//localhost:
9200/music/lyrics/_search?
q=lyrics:
'you'"
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":
"WallaceSaunders","year":
1909,"styles":
["traditional"],"album":
"Unknown","name":
"BalladofCaseyJones","lyrics":
"Comeallyourounders
ifyouwanttohearThestoryofabraveengineerCaseyJoneswastherounder'sname....Comeall
youroundersifyouwanttohearThestoryofabraveengineerCaseyJoneswastherounder'sname
Onthesix-eightwheeler,boys,hewonhisfameThecallercalledCaseyathalfpastfourHekissed
hiswifeatthestationdoorHemountedtothecabinwiththeordersinhishandAndhetookhis
farewelltriptothatpromis'dlandChorus:
CaseyJones--mountedtohiscabinCaseyJones--withhis
ordersinhishandCaseyJones--mountedtohiscabinAndhetookhis...land"
}},{"_index":
"music","_type":
"songs","_id":
"3","_score":
0.06780553,"_source":
{"artist":
"Clarence
Ashley","year":
1920,"name":
"WalkingBoss","styles":
["folk","protest"],"album":
"Traditional","lyrics":
"Walkin'bossWalkin'bossWalkin'bossIdon'tbelongtoyouIbelongI
belongIbelongTothatsteeldrivingcrewWellyouworkonedayWorkonedayWorkonedayThengo
layaroundtheshantytwo"}}]}}
使用其他比较符
还有其他各种比较符可供使用。
例如,找到所有1900年以前编写的歌曲:
curl-XGET"http:
//localhost:
9200/music/lyrics/_search?
q=year:
<1900
此查询将返回完整的“CaseyJones”和“WalkingBoss”文档。
限制字段
要限制您在结果中看到的字段,可将 fields 参数添加到您的查询中:
curl-XGET"http:
//localhost:
9200/music/lyrics/_search?
q=year:
>1900&fields=year"
检查搜索返回对象
清单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]
}
}]
}
}
在结果中,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"
}
}
}
然后运行:
curl-XGET"http:
//localhost:
9200/music/lyrics/_search"-d@query.json
从Java代码使用Elasticsearch
“Elasticsearch强大功能会在通过语言API使用它时体现出来。
”
Elasticsearch强大功能会在通过语言API使用它时体现出来。
现在我将介绍JavaAPI,您将从一个应用程序执行搜索。
请参见 下载 部分,获取相关的示例代码。
该应用程序使用了Spark微型框架,所以可以很快设置它。
示例应用程序
为一个新项目创建一个目录,然后运行(将该命令键入到一行上):
mvnarchetype:
generate-DgroupId=com.dw-DartifactId=es-demo
-DarchetypeArtifactId=maven-archetype-quickstart-DinteractiveMode=false
要生成一个项目来在Eclipse中使用,可通过 cd 进入Maven创建的项目目录,并运行 mvneclipse:
eclipse。
在Eclipse中,选择 File > Import > ExistingProjectintoWorkspace。
导航到您使用Maven的文件夹,选择该项目,单击 Finish。
在Eclipse中,您可以看到一个基本的Java项目布局,包括根目录中的pom.xml文件和一个com.dw.App.java主要类文件。
将您所需的依赖项添加到pom.xml文件中。
清单4给出了完整的pom.xml文件。
清单4.完整的pom.xml
//maven.apache.org/POM/4.0.0"xmlns: xsi="http: //www.w3.org/2001/XMLSchema-instance" xsi: schemaLocation="http: //maven.apache.org/POM/4.0.0http: //maven.apache.org/maven-v4_0_0.xsd"> //maven.apache.org 清单4中的依赖项获取Spark框架核心、SparkFreemarker模板支持和Elasticsearch。 另请注意,我将 我不知道您的情况,但我不久前构建了许多RESTful应用程序,所以为了改变以下步调,您将为应用程序提供一个更加传统的“提交和加载(submit-and-load)”UI。 在Eclipse中,在导航器中右键单击项目,选择 Configure > ConverttoMavenProject,以便Eclipse可以解析Maven依赖项。 转到项目,右键单击该项目,然后选择 Maven > UpdateProject。 Java客户端配置 Elasticsearch的Java客户端非常强大;它可以建立一个嵌入式实例并在必要时运行管理任务。 但我在这里将重点介绍如何运行针对您已运行的节点的应用程序任务。 运行一个Java应用程序和Elasticsearch时,有两种操作模式可供使用。 该应用程序可在Elasticsearch集群中扮演更加主动或更加被动的角色。 在更加主动的情况下(称为NodeClient),应用程序实例将从集群接收请求,确定哪个节点应处理该请求,就像正常节点所做的一样。 (应用程序甚至可以托管索引和处理请求。 )另一种模式称为TransportClient,它将所有请求都转发到另一个Elasticsearch节点,由后者来确定最终目标。 获取TransportClient 对于演示应用程序,(通过App.java中执行的初始化)选择TransportClient,并保持Elasticsearch执行最低级别的处理: Clientclient=TransportClient.builder().build() .addTransportAddress(newInetSocketTransportAddress(InetAddress.getByName("localhost"),9300)); 如果连接到一个Elasticsearch集群,构建器可以接受多个地址。 (在本例中,您只有一个localhost节点。 )连接到端口9300,而不是像之前在RESTAPI的cURL中一样连接到9200。 Java客户端将会使用这个特殊端口,使用端口9200不起作用。 (其他Elasticsearch客户
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 应用程序中使用 Elasticsearch 应用程序 使用