![Elasticsearch实战与原理解析](https://wfqqreader-1252317822.image.myqcloud.com/cover/554/30918554/b_30918554.jpg)
4.2 提交请求
在创建好客户端之后,执行请求之前还需构建请求对象。用户可以通过调用客户端的performRequest和performRequestAsync方法来发送请求。
其中,performRequest是同步请求方法,它将阻塞调用线程,并在请求成功时返回响应,或者在请求失败时引发异常。
而performRequestAsync是异步方法,它接收一个ResponseListener对象作为参数。如果请求成功,则该参数使用响应进行调用;如果请求失败,则使用异常进行调用。
1.构建请求对象Request
请求对象Request的请求方式与The HTTP的请求方式相同,如GET、POST、HEAD等,代码如下所示:
![](https://epubservercos.yuewen.com/A9D91A/16793577104229806/epubprivate/OEBPS/Images/38380_95_3.jpg?sign=1738992838-59GGVs2CboJQ2NonYVT0xJngAqmJqh23-0-dde4ec9e7b02ac275d220fb02c04284b)
2.请求的执行
在构建请求(Request)后,即可执行请求。请求有同步执行和异步执行两种方式。下面将分别展示如何使用performRequest方法和performRequestAsync方法发送请求。
同步方式
当以同步方式执行Request时,客户端会等待Elasticsearch服务器返回的查询结果Response。在收到Response后,客户端继续执行相关的逻辑代码。以同步方式执行的代码如下所示,我们仍然构建三层代码,分别是Controller层、Service层和ServiceImpl实现层。
其中,在Controller层的MeetElasticSearchController类中添加如下代码:
![](https://epubservercos.yuewen.com/A9D91A/16793577104229806/epubprivate/OEBPS/Images/38380_96_2.jpg?sign=1738992838-6DBYN29MakWhf8DoZk9oo4JXnWRHGAAy-0-d64833728fb33fb1fdb32c14fa6204d1)
随后,在Service层的MeetElasticSearchService类中添加如下代码:
![](https://epubservercos.yuewen.com/A9D91A/16793577104229806/epubprivate/OEBPS/Images/38380_96_3.jpg?sign=1738992838-Pwj6OZtY75NBA8jFaxKR3JrPF01z8Fqy-0-a80f1a52c9f2082c322950237239acca)
在ServiceImpl实现层的MeetElasticSearchServiceImpl类中添加如下代码:
![](https://epubservercos.yuewen.com/A9D91A/16793577104229806/epubprivate/OEBPS/Images/38380_96_4.jpg?sign=1738992838-QuGu10VEj6QNx2Q125ao0lmfxHfT6eDk-0-5035255094c6cb04dcd65b0d4e624345)
随后编译工程,在工程根目录下输入如下命令:
![](https://epubservercos.yuewen.com/A9D91A/16793577104229806/epubprivate/OEBPS/Images/38380_97_2.jpg?sign=1738992838-4x7AYaW83aLn7JTC6dPTz9SkzuVrKh2D-0-c1ddcc8e45862c75c04859ed1a249d41)
通过如下命令启动工程服务:
![](https://epubservercos.yuewen.com/A9D91A/16793577104229806/epubprivate/OEBPS/Images/38380_97_3.jpg?sign=1738992838-MMQRULA9E6W5sNa1U3XYVLu16YiSpVFu-0-d3acd0a7246cdc51d62ba64e5f1528ac)
在工程服务启动后,在浏览器中通过调用如下接口查看Elasticsearch客户端的连接情况:
![](https://epubservercos.yuewen.com/A9D91A/16793577104229806/epubprivate/OEBPS/Images/38380_97_4.jpg?sign=1738992838-qeUXHjg9RTRzCIxj5qe6nZZMBndcEace-0-36982e695dad5ac81629f3abe5246ce7)
在浏览器中可以看到请求发送成功,显示的Response信息如下所示。
![](https://epubservercos.yuewen.com/A9D91A/16793577104229806/epubprivate/OEBPS/Images/38380_97_5.jpg?sign=1738992838-FdmXpisD31IGNDfnbVCu9ccciUc9CVqk-0-f0faebf59b103562d222d822be71f225)
异步方式
当以异步方式执行请求时,初级客户端不必同步等待请求结果的返回,可以直接向接口调用方返回异步接口执行成功的结果。
为了处理异步返回的响应信息或处理在请求执行过程中引发的异常信息,用户需要指定监听器。以异步方式调用的代码如下所示。我们在ServiceImpl实现层的MeetElasticSearchServiceImpl类中添加如下代码:
![](https://epubservercos.yuewen.com/A9D91A/16793577104229806/epubprivate/OEBPS/Images/38380_97_6.jpg?sign=1738992838-c5qLibgpZMjmcoRRrLV3Tlt32aYwFj0P-0-5f94d040ed40008da8c96bd124d8b9bc)
在异步请求处理后,如果请求执行成功,则调用ResponseListener类中的onResponse方法进行相关逻辑的处理;如果请求执行失败,则调用ResponseListener类中的onFailure方法进行相关逻辑的处理。
3.可选参数配置
不论同步请求,还是异步请求,我们都可以在请求中添加参数,添加方法如下所示:
![](https://epubservercos.yuewen.com/A9D91A/16793577104229806/epubprivate/OEBPS/Images/38380_98_2.jpg?sign=1738992838-xZfFiFA72sQyOaxp2WE3YxJDNcEUg933-0-334a0e50b058cf1c8d63deb7ab41d9ae)
可以将请求的主体设置为任意HttpEntity,设置方法如下所示:
![](https://epubservercos.yuewen.com/A9D91A/16793577104229806/epubprivate/OEBPS/Images/38380_98_3.jpg?sign=1738992838-RZ0ANtlJ6kr2gS9H7B1V15Cly3CX7noZ-0-dd28a220c7ffd19b63cb3c529ca4d1fc)
还可以将其设置为一个字符串,在Elasticsearch中,默认使用application/json的内容格式,设置方法如下所示:
![](https://epubservercos.yuewen.com/A9D91A/16793577104229806/epubprivate/OEBPS/Images/38380_98_4.jpg?sign=1738992838-kcbNEiFyEbMhaCbAq8B5VWoZRkDlivZy-0-d62796cd58c55571cbca21aa08c79dca)
此外,Request还有一些可选的请求构建选项,通过RequestOptions来实现。
需要说明的是,在RequestOptions类中保存的请求,可以在同一应用程序的多个请求之间共享。因此用户可以创建一个单实例,然后在所有请求之间共享。具体方法如下所示:
![](https://epubservercos.yuewen.com/A9D91A/16793577104229806/epubprivate/OEBPS/Images/38380_98_5.jpg?sign=1738992838-mR2B1AjYbInqeKepTPl7Y072AmSezfHR-0-f820c1f095a3fb1bc29aa6cedc686077)
上述代码中的TOKEN表示添加所有请求所需的任何头。
而AddHeader用于授权或在Elasticsearch前使用代理所需的头信息。在使用时,不需要设置Content-Type头,因为客户端将自动在请求的HttpEntity中设置Content-Type头。
在创建好RequestOptions单实例COMMON_OPTIONS后,我们就可以在发出请求时使用它了,使用方法如下所示:
![](https://epubservercos.yuewen.com/A9D91A/16793577104229806/epubprivate/OEBPS/Images/38380_99_2.jpg?sign=1738992838-JOpIdnNUAHjkHbKLvO1i5hJOIREu5FT3-0-6646cd4a85e367d8293cdaba8a25cd70)
Elasticsearch允许用户根据每个请求定制这些选项,如添加一个额外的标题:
![](https://epubservercos.yuewen.com/A9D91A/16793577104229806/epubprivate/OEBPS/Images/38380_99_3.jpg?sign=1738992838-iNDhnxZIlIJFDIp71FDkgaWN8PL23oFJ-0-6d5312a20976dbd5e993cc596dfbeb48)
RequestOptions在ServiceImpl实现层的MeetElasticSearchServiceImpl类中的代码如下所示:
![](https://epubservercos.yuewen.com/A9D91A/16793577104229806/epubprivate/OEBPS/Images/38380_99_4.jpg?sign=1738992838-byyklwcjG3RbYYlXEGvUE67v9ksJTB0f-0-4ceed1ab8004ea9e6fead56faa29975e)
4.多个并行异步操作
除单个操作的执行外,Elasticsearch的客户端还可以并行执行许多操作。下面通过ServiceImpl实现层MeetElasticSearchServiceImpl类中的示例,展示如何对多文档进行并行索引。代码如下:
![](https://epubservercos.yuewen.com/A9D91A/16793577104229806/epubprivate/OEBPS/Images/38380_100_2.jpg?sign=1738992838-h14wlyI1pSSBS1Q5lg33CE8hW9JjhnqV-0-a80f2bda13bc24653617750fc83cb8a6)