在Es7.15版本之后,es官方将它的高级客户端RestHighLevelClient标记为弃用状态。同时推出了全新的java API客户端Elasticsearch Java API Client,该客户端也将在Elasticsearch8.0及以后版本中成为官方推荐使用的客户端。
Elasticsearch Java API Client支持除Vector title search API和Find structure API之外的所有Elasticsearch API。且支持所有API数据类型,并且不再有原始JSON Value属性。它是针对Elasticsearch8.0及之后版本的客户端。
感兴趣的小伙伴可以去官方文档看看:Elasticsearch官网8.x版本下Java客户端文档
新建maven项目
maven中引入依赖坐标
<dependency>
<groupId>co.elastic.clients</groupId>
<artifactId>elasticsearch-java</artifactId>
<version>8.1.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
<scope>provided</scope>
</dependency>
@Test
public void create() throws IOException {
// 创建低级客户端
RestClient restClient = RestClient.builder(
new HttpHost("localhost", 9200)
).build();
// 使用Jackson映射器创建传输层
ElasticsearchTransport transport = new RestClientTransport(
restClient, new JacksonJsonpMapper()
);
// 创建API客户端
ElasticsearchClient client = new ElasticsearchClient(transport);
// 关闭ES客户端
transport.close();
restClient.close();
}
@Test
public void create() throws IOException {
// 创建低级客户端
RestClient restClient = RestClient.builder(
new HttpHost("localhost", 9200)
).build();
// 使用Jackson映射器创建传输层
ElasticsearchTransport transport = new RestClientTransport(
restClient, new JacksonJsonpMapper()
);
// 创建API客户端
ElasticsearchClient client = new ElasticsearchClient(transport);
// 创建索引
CreateIndexResponse createIndexResponse = client.indices().create(c -> c.index("user_test"));
// 响应状态
Boolean acknowledged = createIndexResponse.acknowledged();
System.out.println("索引操作 = " + acknowledged);
// 关闭ES客户端
transport.close();
restClient.close();
}
@Test
public void query() throws IOException {
RestClient restClient = RestClient.builder(
new HttpHost("localhost",9200)
).build();
ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
ElasticsearchClient client = new ElasticsearchClient(transport);
// 查询索引
GetIndexResponse getIndexResponse = client.indices().get(e -> e.index("user_test"));
System.out.println("getIndexResponse.result() = " + getIndexResponse.result());
System.out.println("getIndexResponse.result().keySet() = " + getIndexResponse.result().keySet());
transport.close();
restClient.close();
}
如果查询的index不存在会在控制台抛出index_not_found_exception
@Test
public void delete() throws IOException {
RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();
ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
ElasticsearchClient client = new ElasticsearchClient(transport);
// 删除索引
DeleteIndexResponse deleteIndexResponse = client.indices().delete(e -> e.index("user_test"));
System.out.println("删除操作 = " + deleteIndexResponse.acknowledged());
transport.close();
restClient.close();
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private String name;
private String sex;
private Integer age;
}
@Test
public void addDocument() throws IOException {
RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();
ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
ElasticsearchClient client = new ElasticsearchClient(transport);
// 向user对象中添加数据
User user = new User("java客户端", "男", 18);
// 向索引中添加数据
CreateResponse createResponse = client.create(e -> e.index("user_test").id("1001").document(user));
System.out.println("createResponse.result() = " + createResponse.result());
transport.close();
restClient.close();
}
注:index中参数为文档所属的索引名,id中参数为当文档的id,document为文档数据,新版本支持直接传入java对象。
@Test
public void queryDocument() throws IOException {
RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();
ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
ElasticsearchClient client = new ElasticsearchClient(transport);
// 构建请求
GetResponse<User> getResponse = client.get(e -> e.index("user_test").id("1001"), User.class);
System.out.println("getResponse.source().toString() = " + getResponse.source().toString());
transport.close();
restClient.close();
}
注:如果查不到控制台抛出NullPointerException
@Test
public void modifyDocument() throws IOException {
RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();
ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
ElasticsearchClient client = new ElasticsearchClient(transport);
// 使用map集合封装需要修改的内容
Map<String, Object> map = new HashMap<>();
map.put("name", "java客户端aaa");
// 构建请求
UpdateResponse<User> updateResponse = client.update(e -> e.index("user_test").id("1001").doc(map), User.class);
System.out.println("updateResponse.result() = " + updateResponse.result());
transport.close();
restClient.close();
}
@Test
public void removeDocument() throws IOException {
RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();
ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
ElasticsearchClient client = new ElasticsearchClient(transport);
// 构建请求
DeleteResponse deleteResponse = client.delete(e -> e.index("user_test").id("1001"));
System.out.println("deleteResponse.result() = " + deleteResponse.result());
transport.close();
restClient.close();
}
@Test
public void batchAddDocument() throws IOException {
RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();
ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
ElasticsearchClient client = new ElasticsearchClient(transport);
// 构建一个批量数据集合
List<BulkOperation> list = new ArrayList<>();
list.add(new BulkOperation.Builder().create(
d -> d.document(new User("test2", "男", 19)).id("1002").index("user_test")).build());
list.add(new BulkOperation.Builder().create(
d -> d.document(new User("test3", "男", 20)).id("1003").index("user_test")).build());
list.add(new BulkOperation.Builder().create(
d -> d.document(new User("test4", "女", 21)).id("1004").index("user_test")).build());
// 调用bulk方法执行批量插入操作
BulkResponse bulkResponse = client.bulk(e -> e.index("user_test").operations(list));
System.out.println("bulkResponse.items() = " + bulkResponse.items());
transport.close();
restClient.close();
}
批量添加的核心是需要构建一个泛型为BulkOperation的ArrayList集合,实质上是将多个请求包装到一个集合中,进行统一请求,进行构建请求时调用bulk方法,实现批量添加效果。
@Test
public void batchDeleteDocument() throws IOException {
RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();
ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
ElasticsearchClient client = new ElasticsearchClient(transport);
// 构建一个批量数据集合
List<BulkOperation> list = new ArrayList<>();
list.add(new BulkOperation.Builder().delete(
d -> d.id("1002").index("user_test")).build());
list.add(new BulkOperation.Builder().delete(
d -> d.id("1003").index("user_test")).build());
// 调用bulk方法执行批量插入操作
BulkResponse bulkResponse = client.bulk(e -> e.index("user_test").operations(list));
System.out.println("bulkResponse.items() = " + bulkResponse.items());
transport.close();
restClient.close();
}
@Test
public void queryAllDocument() throws IOException {
RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();
ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
ElasticsearchClient client = new ElasticsearchClient(transport);
// 全量查询
SearchResponse<User> searchResponse = client.search(e -> e.index("user_test").query(q -> q.matchAll(m -> m)), User.class);
HitsMetadata<User> hits = searchResponse.hits();
for (Hit<User> hit : hits.hits()) {
System.out.println("user = " + hit.source().toString());
}
System.out.println("searchResponse.hits().total().value() = " + searchResponse.hits().total().value());
transport.close();
restClient.close();
}
@Test
public void pagingQueryDocument() throws IOException {
RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();
ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
ElasticsearchClient client = new ElasticsearchClient(transport);
// 分页查询
SearchResponse<User> searchResponse = client.search(
s -> s.index("user_test")
.query(q -> q.matchAll(m -> m))
.from(2)
.size(2)
, User.class);
searchResponse.hits().hits().forEach(h -> System.out.println(h.source().toString()));
transport.close();
restClient.close();
}
分页查询就是在全量查询的基础上增加了从第几条开始,每页显示几条
@Test
public void sortQueryDocument() throws IOException {
RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();
ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
ElasticsearchClient client = new ElasticsearchClient(transport);
// 排序查询
SearchResponse<User> searchResponse = client.search(
s -> s.index("user_test")
.query(q -> q.matchAll(m -> m))
.sort(o -> o.field(f -> f.field("age").order(SortOrder.Asc)))
, User.class);
searchResponse.hits().hits().forEach(h -> System.out.println(h.source().toString()));
transport.close();
restClient.close();
}
@Test
public void conditionQueryDocument() throws IOException {
RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();
ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
ElasticsearchClient client = new ElasticsearchClient(transport);
// 条件查询
SearchResponse<User> searchResponse = client.search(
s -> s.index("user_test").query(q -> q.matchAll(m -> m))
.sort(o -> o.field(f -> f.field("age").order(SortOrder.Asc)))
.source(r -> r.filter(f -> f.includes("name", "age").excludes("")))
, User.class);
searchResponse.hits().hits().forEach(h -> System.out.println(h.source().toString()));
transport.close();
restClient.close();
}
includes是显示的字段,excludes是排除的字段
@Test
public void combinationQueryDocument() throws IOException {
RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();
ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
ElasticsearchClient client = new ElasticsearchClient(transport);
// 组合查询
SearchResponse<User> searchResponse = client.search(
s -> s.index("user_test").query(q -> q.bool(b -> b
.must(m -> m.match(u -> u.field("age").query(21)))
.must(m -> m.match(u -> u.field("sex").query("男")))
.mustNot(m -> m.match(u -> u.field("sex").query("女")))
))
, User.class);
searchResponse.hits().hits().forEach(h -> System.out.println(h.source().toString()));
transport.close();
restClient.close();
}
@Test
public void combinationQueryDocument2() throws IOException {
RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();
ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
ElasticsearchClient client = new ElasticsearchClient(transport);
// 组合查询
SearchResponse<User> searchResponse = client.search(
s -> s.index("user_test").query(q -> q.bool(b -> b
.should(h -> h.match(u -> u.field("age").query(19)))
.should(h -> h.match(u -> u.field("sex").query("男")))
))
, User.class);
searchResponse.hits().hits().forEach(h -> System.out.println(h.source().toString()));
transport.close();
restClient.close();
}
must是必须满足所有条件,should只要满足一个就行
@Test
public void scopeQueryDocument2() throws IOException {
RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();
ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
ElasticsearchClient client = new ElasticsearchClient(transport);
// 范围查询,gte()表示取大于等于,gt()表示大于,lte()表示小于等于
SearchResponse<User> searchResponse = client.search(s -> s.index("user_test").query(q -> q
.range(r -> r.field("age").gte(JsonData.of(20)).lt(JsonData.of(21))))
, User.class);
searchResponse.hits().hits().forEach(h -> System.out.println(h.source().toString()));
transport.close();
restClient.close();
}
@Test
public void fuzzyQueryDocument2() throws IOException {
RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();
ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
ElasticsearchClient client = new ElasticsearchClient(transport);
// 模糊查询,fuzziness表示差几个可以查询出来
SearchResponse<User> searchResponse = client.search(s -> s.index("user_test").query(q -> q
.fuzzy(f -> f.field("name").value("tst").fuzziness("2")))
, User.class);
searchResponse.hits().hits().forEach(h -> System.out.println(h.source().toString()));
transport.close();
restClient.close();
}
@Test
public void highlightQueryDocument2() throws IOException {
RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();
ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
ElasticsearchClient client = new ElasticsearchClient(transport);
// 高亮查询
SearchResponse<User> searchResponse = client.search(s -> s.index("user_test").query(q -> q
.term(t -> t.field("name").value("test3")))
.highlight(h -> h.fields("name", f -> f.preTags("<font color='red'>").postTags("</font>")))
, User.class);
searchResponse.hits().hits().forEach(h -> System.out.println(h.source().toString()));
transport.close();
restClient.close();
}
@Test
public void aggregateQueryDocument2() throws IOException {
RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();
ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
ElasticsearchClient client = new ElasticsearchClient(transport);
// 聚合查询,取最大年龄
SearchResponse<User> searchResponse = client.search(s -> s.index("user_test").aggregations("maxAge", a ->a.max(m -> m.field("age")))
, User.class);
searchResponse.aggregations().entrySet().forEach(f -> System.out.println(f.getKey() + ":" + f.getValue().max().value()));
transport.close();
restClient.close();
}
@Test
public void groupQueryDocument2() throws IOException {
RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();
ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
ElasticsearchClient client = new ElasticsearchClient(transport);
// 分组查询
SearchResponse<User> searchResponse = client.search(s -> s.index("user_test")
.aggregations("ageGroup", a ->a.terms(t -> t.field("age")))
, User.class);
searchResponse.aggregations().get("ageGroup").lterms().buckets().array().forEach(f -> System.out.println(f.key() + ":" + f.docCount()));
transport.close();
restClient.close();
}
分组查询实质上是聚合查询的一种
看到这里的小伙伴点个免费的赞吧,感谢支持!!!
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这
我有用于控制用户任务的Rails5API项目,我有以下错误,但并非总是针对相同的Controller和路由。ActionController::RoutingError:uninitializedconstantApi::V1::ApiController我向您描述了一些我的项目,以更详细地解释错误。应用结构路线scopemodule:'api'donamespace:v1do#=>Loginroutesscopemodule:'login'domatch'login',to:'sessions#login',as:'login',via::postend#=>Teamroutessc
如果我使用ruby版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更
我安装了ruby版本管理器,并将RVM安装的ruby实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby。有没有办法让emacs像shell一样尊重ruby的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
有人知道在发布新版本的Ruby和Rails时收到电子邮件的方法吗?他们有邮件列表,RubyonRails有一个推特,但我不想听到那些随之而来的喧嚣,我只想知道什么时候发布新版本,尤其是那些有安全修复的版本。 最佳答案 从therailsblog获取提要.http://weblog.rubyonrails.org/feed/atom.xml 关于ruby-on-rails-如何在发布新的Ruby或Rails版本时收到通知?,我们在StackOverflow上找到一个类似的问题: