在 Java 应用程序中使用 ElasticsearchWord文件下载.docx
《在 Java 应用程序中使用 ElasticsearchWord文件下载.docx》由会员分享,可在线阅读,更多相关《在 Java 应用程序中使用 ElasticsearchWord文件下载.docx(14页珍藏版)》请在冰豆网上搜索。
![在 Java 应用程序中使用 ElasticsearchWord文件下载.docx](https://file1.bdocx.com/fileroot1/2022-12/14/332a3aac-4310-468f-bf8e-299091bf1313/332a3aac-4310-468f-bf8e-299091bf13131.gif)
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命令都键入到一行中):
9200/music/songs/1"
-d'
{"
name"
:
"
DecktheHalls"
"
year"
1885,"
lyrics"
Falalalala"
}'
前面的命令使用
PUT
动词将一个文档添加到
/songs
文档类型,并为该文档分配ID1。
URL路径显示为
index/doctype/ID。
查看文档
要查看该文档,可使用简单的
GET
命令:
curl-XGET"
Elasticsearch使用您之前
进索引中的JSON内容作为响应:
{"
_index"
"
music"
"
_type"
songs"
_id"
1"
_version"
1,"
found"
true,"
_source"
}}
更新文档
如果您认识到日期写错了,并想将它更改为1886怎么办?
可运行以下命令来更新文档:
9200/music/lyrics/1"
1886,"
因为此命令使用了相同的唯一ID1,所以该文档会被更新。
删除文档(但暂时不要删除)
暂时不要删除该文档,知道如何删除它就行了:
curl-XDELETE"
从文件插入文档
这是另一个技巧。
您可以使用一个文件的内容来从命令行插入文档。
尝试此方法,添加另一首针对传统歌曲“BalladofCaseyJones”的文档。
将清单1复制到一个名为caseyjones.json的文件中;
也可以使用示例代码包中的caseyjones.json文件(参见
下载)。
将该文件放在任何方便对它运行cURL命令的地方。
(在下载的代码中,该文件位于根目录中。
清单1.“BalladofCaseyJones”的JSON文档
{
artist"
WallaceSaunders"
1909,
styles"
["
traditional"
],
album"
Unknown"
BalladofCaseyJones"
Comeallyouroundersifyouwanttohear
Thestoryofabraveengineer
CaseyJoneswastherounder'
sname....
sname
Onthesix-eightwheeler,boys,hewonhisfame
ThecallercalledCaseyathalfpastfour
Hekissedhiswifeatthestationdoor
Hemountedtothecabinwiththeordersinhishand
Andhetookhisfarewelltriptothatpromis'
dland
Chorus:
CaseyJones--mountedtohiscabin
CaseyJones--withhisordersinhishand
Andhetookhis...land"
}
运行以下命令,将此文档
到您的
music
索引中:
$curl-XPUT"
9200/music/lyrics/2"
-d@caseyjones.json
在该索引中时,将清单2的内容(包含另一手民歌“WalkingBoss”)保存到walking.json文件中。
清单2.“WalkingBoss”JSON
ClarenceAshley"
1920
WalkingBoss"
folk"
protest"
Traditional"
Walkin'
boss
Idon'
tbelongtoyou
Ibelong
Tothatsteeldrivingcrew
Wellyouworkoneday
Workoneday
Thengolayaroundtheshantytwo"
将此文档推送到索引中:
9200/music/lyrics/3"
-d@walking.json
搜索RESTAPI
是时候运行一次基本查询了,此查询比您运行来查找“GettheHalls”文档的简单
要复杂一些。
文档URL有一个内置的
_search
端点用于此用途。
在歌词中找到所有包含单词
you
的歌曲:
9200/music/lyrics/_search?
q=lyrics:
'
you'
q
参数表示一个查询。
响应是:
took"
107,"
timed_out"
false,"
_shards"
total"
5,"
successful"
failed"
0},"
hits"
2,"
max
_score"
0.15625,"
[{"
2"
_
score"
1909,"
["
],"
Comeallyourounders
ifyouwanttohearThestoryofabraveengineerCaseyJoneswastherounder'
sname....Comeall
youroundersifyouwanttohearThestoryofabraveengineerCaseyJoneswastherounder'
Onthesix-eightwheeler,boys,hewonhisfameThecallercalledCaseyathalfpastfourHekissed
hiswifeatthestationdoorHemountedtothecabinwiththeordersinhishandAndhetookhis
farewelltriptothatpromis'
dlandChorus:
CaseyJones--mountedtohiscabinCaseyJones--withhis
ordersinhishandCaseyJones--mountedtohiscabinAndhetookhis...land"
}},{"
3"
0.06780553,"
Clarence
Ashley"
1920,"
bossWalkin'
bossIdon'
tbelongtoyouIbelongI
belongIbelongTothatsteeldrivingcrewWellyouworkonedayWorkonedayWorkonedayThengo
layaroundtheshantytwo"
}}]}}
使用其他比较符
还有其他各种比较符可供使用。
例如,找到所有1900年以前编写的歌曲:
q=year:
<
1900
此查询将返回完整的“CaseyJones”和“WalkingBoss”文档。
限制字段
要限制您在结果中看到的字段,可将
fields
参数添加到您的查询中:
>
1900&
fields=year"
检查搜索返回对象
清单3给出了Elasticsearch从前面的查询返回的数据。
清单3.查询结果
6,
false,
{
5,
0
},
2,
max_score"
1.0,
[{
fields"
[1920]
}
},{
[1909]
}]
在结果中,Elasticsearch提供了多个JSON对象。
第一个对象包含请求的元数据:
看看该请求花了多少毫秒(took)和它是否超时(timed_out)。
_shards
字段需要考虑Elasticsearch是一个集群化服务的事实。
甚至在这个单节点本地部署中,Elasticsearch也在逻辑上被集群化为分片。
继续查看清单3中的搜索结果,可以观察到
hits
对象包含:
∙total
字段,它会告诉您获得了多少个结果
∙max_score,用于全文搜索
∙实际结果
实际结果包含
属性,因为您将
参数添加到了查询中。
否则,结果中会包含
source,而且包含完整的匹配文档。
_index、_type
_id
的用途不言自明;
_score
指的是全文搜索命中长度。
这4个字段始终会在结果中返回。
使用JSON查询DSL
基于查询字符串的搜索很快会变得很复杂。
对于更高级的查询,Elasticsearch提供了一种完全基于JSON的特定于领域的语言(DSL)。
例如,要搜索
album
值为
traditional
的每首歌曲,可创建一个包含以下内容的query.json文件:
query"
:
match"
然后运行:
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
projectxmlns="
//maven.apache.org/POM/4.0.0"
xmlns:
xsi="
//www.w3.org/2001/XMLSchema-instance"
xsi:
schemaLocation="
//maven.apache.org/POM/4.0.0http:
//maven.apache.org/maven-v4_0_0.xsd"
<
modelVersion>
4.0.0<
/modelVersion>
groupId>
com.dw<
/groupId>
artifactId>
es-demo<
/artifactId>
packaging>
jar<
/packaging>
version>
1.0-SNAPSHOT<
/version>
name>
/name>
url>
//maven.apache.org<
/url>
build>
plugins>
plugin>
org.apache.maven.plugins<
maven-compiler-plugin<
configuration>
compilerVersion>
1.8<
/compilerVersion>
source>
/source>
target>
/target>
/configuration>
/plugin>
/plugins>
/build>
dependencies>
dependency>
com.sparkjava<
spark-core<
2.3<
/dependency>
spark-template-freemarker<
org.elasticsearch<
elasticsearch<
2.1.1<
/dependencies>
/project>
清单4中的依赖项获取Spark框架核心、SparkFreemarker模板支持和Elasticsearch。
另请注意,我将
版本设置为Java8,Spark需要该版本(因为它大量使用了lambda)。
我不知道您的情况,但我不久前构建了许多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客户