概述
在我的上一篇文章中, 我谈到了如何使用 sping-data-elastectsearch 项目与弹性搜索工程连接并执行 crud 操作。不过, 我也提到过, 这个项目没有更新, 无法与最新版本的弹性搜索引擎兼容。因此, 在这篇文章中, 我将介绍如何使用传输客户端库与最新版本的 elasticjecn 搜索引擎进行交互。我将使用 spring boot 作为客户端应用程序, 然后为其他所需的库添加依赖项。
必备条件
-
jdk 1。8
-
Maven
-
弹性搜索引擎下载 5. x 或 6. x (我将解释如何下载的步骤)
-
作为 ide 的日食或 vsd
设置弹性搜索
第1步-转到弹性的官方网站。
第2步-在下拉列表中选择弹性搜索, 然后将其版本为5.5.0 然后单击 “下载” 按钮。
步骤 3 -它会给你的选项, 如果你想下载作为 zip, tar, 或 rpm 文件。我选择了 zip 格式作为在窗口上使用它。
步骤 4 -解压缩下载的内容, 并转到 bin
文件夹。将有一个名为的文件 elasticsearch.bat
。
第5步-通过命令提示符在 windows 操作系统上运行此文件, 它将为您启动弹性搜索引擎。一旦启动, 它将开始侦听端口9200。因此, url 将http://localhost:9200/。此外, 端口9300作为群集节点公开。端口9200用于 rest 通信, 可由 java 或任何其他语言使用, 9200 端口也可用于弹性搜索群集节点通信, java 也可以使用传输协议连接到此群集节点。
第6步-测试, 以验证这一切都正确启动使用 curl 命令启动 url。您可以在 windows 上使用 powershell。
curl http://localhost:9200/
StatusCode : 200
StatusDescription : OK
Content : {
"name" : "ggyBmti",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "Bp6EeKIoQNqGj0iV5sHtWg",
"version" : {
"number" : "5.5.0",
"build_hash" : "260387d",
"build_date" : "2017-...
RawContent : HTTP/1.1 200 OK
Content-Length: 327
Content-Type: application/json; charset=UTF-8
{
"name" : "ggyBmti",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "Bp6EeKIoQNqGj0iV5sHtWg",
"versi...
Forms : {}
Headers : {[Content-Length, 327], [Content-Type, application/json; charset=UTF-8]}
Images : {}
InputFields : {}
Links : {}
ParsedHtml : mshtml.HTMLDocumentClass
RawContentLength : 327
一旦搜索引擎启动, 让我们尝试测试它提供的一些 rest api 与引擎交互。
http://localhost:9200/users/employee/1
使用邮差 POST
或卷曲的方法启动。输入应采用 json 格式.
{
"userId" :"1",
"name" : "Rajesh",
"userSettings" : {
"gender" : "male",
"occupation" : "CA",
"hobby" : "chess"
}
}
响应将显示它已创建 “用户” 作为索引名称, “员工” 作为类型, 并且已创建的文档的 id 为 “1”这将产生以下文档信息:
{
"_index": "users",
"_type": "employee",
"_id": "1",
"_version": 3,
"found": true,
"_source": {
"userId": "1",
"name": "Rajesh",
"userSettings": {
"gender": "male",
"occupation": "CA",
"hobby": "chess"
}
}
}
现在, 如果我们要按任何特定字段搜索文档, 则需要 _search
在 rest api url 中添加作为路径。若要启动此操作, 请运行以下命令 curl -XGET 'http://localhost:9200/users/employee/_search'
:
这将搜索具有 “用户” 和 “员工” 类型索引的所有文档。现在, 如果要搜索特定字段, 则需要添加一些查询匹配条件, 作为 json 的一部分。
curl -XGET 'http://localhost:9200/users/employee/_search'
-H 'Content-Type: application/json' -d
' {"query": { "match": {"name" : "Rajesh" } }}'
这将搜索具有 “名称” 字段设置为 “rajesh” 的文档。
现在, 我们已经了解了 elasticsearch rest api 是如何为文档执行创建、检索和其他操作的;让我们试着了解如何将我们的应用程序集连接到弹性搜索引擎到我们的应用程序代码。我们可以直接从代码调用这些 rest api, 也可以使用 elasticsearch 提供的传输客户端。让我们开发一个弹簧引导应用程序来展示所有 crud 操作。
开发弹簧启动应用程序
马文依赖关系
除了春靴罐, 我们还需要弹性搜索、传输客户端和 log4j 罐子。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>5.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.7</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.7</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>2.7</version>
</dependency>
</dependencies>
配置
由于我们将使用传输客户端连接到 elasticj引擎, 我们需要为引擎的群集节点提供 url 路径。因此, 我已将属性放在 url 的主机和端口的应用程序. 属性文件中。
# Local Elasticsearch config
elasticsearch.host=localhost
elasticsearch.port=9300
# App config
server.port=8102
spring.application.name=BootElastic
域
创建一个名为的域类 User
。json 输入将映射到此 User
对象。这将用于创建与索引和类型关联的用户文档。
public class User {
private String userId;
private String name;
private Date creationDate = new Date();
private Map<String, String> userSettings = new HashMap<>();
-- getter/setter methods
}
配置
创建了一个 java 配置文件, 以创建连接到 elasticsearch 群集节点的传输客户端属性文件。
@Configuration
public class config{
@Value("${elasticsearch.host:localhost}")
public String host;
@Value("${elasticsearch.port:9300}")
public int port;
public String getHost() {
return host;
}
public int getPort() {
return port;
}
@Bean
public Client client(){
TransportClient client = null;
try{
System.out.println("host:"+ host+"port:"+port);
client = new PreBuiltTransportClient(Settings.EMPTY)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(host), port));
} catch (UnknownHostException e) {
e.printStackTrace();
}
return client;
}
}
控制器
UserController
是为了展示以下功能而创建的:
-
创建一个名为 “用户” 的索引, 然后键入 “员工”.它将创建用于存储用户信息的文档。文档的 id 可以作为 json 输入传递, 或者, 如果未传递, elasticsearch 将生成自己的 id。客户端有一个名为
prepareIndex()
w hich 的方法, 用于生成文档对象并根据索引和类型进行存储。此方法是一种POST
方法调用, 其中User
信息将作为 json 传递。
@Autowired
Client client;
@PostMapping("/create")
public String create(@RequestBody User user) throws IOException {
IndexResponse response = client.prepareIndex("users", "employee", user.getUserId())
.setSource(jsonBuilder()
.startObject()
.field("name", user.getName())
.field("userSettings", user.getUserSettings())
.endObject()
)
.get();
System.out.println("response id:"+response.getId());
return response.getResult().toString();
}
2. 根据传递的 tge “id” 查看用户信息。客户端有一种 prepareGet()
基于索引、类型和 id 检索信息的方法。它将以 json 格式返回用户信息。
@GetMapping("/view/{id}")
public Map<String, Object> view(@PathVariable final String id) {
GetResponse getResponse = client.prepareGet("users", "employee", id).get();
return getResponse.getSource();
}
3. 根据字段名称查看用户信息。我 matchQuery()
在这里用 “名称” 字段搜索并返回 User
信息。但是, query()
QueryBuilders
该类有许多不同类型的可用。例如, 用于 rangeQuery()
搜索特定范围内的字段值, 例如年龄在10到20岁之间。有一种 wildcardQuery()
使用 通配符搜索字段的方法. termQuery()
也是可用的。您可以根据自己的需要玩所有这些游戏。
@GetMapping("/view/name/{field}")
public Map<String, Object> searchByName(@PathVariable final String field) {
Map<String,Object> map = null;
SearchResponse response = client.prepareSearch("users")
.setTypes("employee")
.setSearchType(SearchType.QUERY_AND_FETCH)
. 匹配查询 (“名称”, 字段)). get ();
搜索 > 搜索命中 = arrays. 列表 (答复. gethit (). gethit ()) < 列表;
地图 = searchHits.get(0).getSource ();
返回地图;
}
4. 通过使用id搜索文档并替换字段值来更新文档。客户端有一个调用的方法 update()
.它接受 UpdateRequest
作为生成更新查询的输入。
@GetMapping("/update/{id}")
public String update(@PathVariable final String id) throws IOException {
UpdateRequest updateRequest = new UpdateRequest();
updateRequest.index("users")
.type("employee")
.id(id)
.doc(jsonBuilder()
.startObject()
.field("name", "Rajesh")
.endObject());
try {
UpdateResponse updateResponse = client.update(updateRequest).get();
System.out.println(updateResponse.status());
return updateResponse.status().toString();
} catch (InterruptedException | ExecutionException e) {
System.out.println(e);
}
return "Exception";
}
5. 最后一种方法是展示如何删除索引和类型的文件。客户端确实有一个 prepareDelete()
方法, 该方法接受索引、类型和 id 来删除文档。
@GetMapping("/delete/{id}")
public String delete(@PathVariable final String id) {
DeleteResponse deleteResponse = client.prepareDelete("users", "employee", id).get();
return deleteResponse.getResult().toString();
}
完整的代码已放在github上。
构建应用程序
运行 mvn clean install
命令以生成 jar 文件。
启动应用程序
运行 java -jar target/standalone-elasticsearch-0.0.1-SNAPSHOT.jar
该命令以启动 “春天启动” 应用程序。
测试应用
应用程序将在 url 上运行 http://localhost:8102
。现在让我们测试一下上面谈到的几个用例。
1. 测试创建文档。
http://localhost:8102/rest/users/create
POST
作为一种方法, 通过卷曲或邮差启动.
输入:
{
"userId":"1",
"name": "Sumit",
"userSettings": {
"gender" : "male",
"occupation" : "CA",
"hobby" : "chess"
}
}
您将看到显示 “已创建” 的响应。
2. 要测试文档是否已创建, 让我们测试视图功能。
http://localhost:8102/rest/users/view/1
使用 GET
该方法启动.
作为响应, 您将看到具有“1” 值的 id 的用户信息。
{
"userSettings": {
"occupation": "CA",
"gender": "male",
"hobby": "chess"
},
"name": "Rajesh"
}
3. 您也可以通过名称字段通过启动来查看用户信息 http://localhost:8102/rest/users/view/name/Rajesh
。这是在传递 “rajesh” 作为 “name” 字段值。
同样, 更新和删除功能也可以通过启动 http://localhost:8102/rest/users/update/1
和 http://localhost:8102/rest/users/delete/1
如上所述, 您可以通过 elasticsearch 传输客户端浏览许多不同类型的查询。