elasticsearch-基础操作
参考链接:
https://www.jianshu.com/p/d5583dff4157
https://blog.csdn.net/fengge18306/article/details/105852727/
版本:6.5.2
一个index下不允许有多个type,一个type允许有多个document。
1. maven依赖
<dependency>
<groupId>org.elasticsearch.plugin</groupId>
<artifactId>transport-netty4-client</artifactId>
<version>6.5.2</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>6.5.2</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>6.5.2</version>
</dependency>
注意点: maven依赖版本号要和elasticsearch的版本号一致
2. 连接elasticsearch
// 集群名称
Settings settings = Settings.builder()
.put("cluster.name", "elasticsearch").build();
// 地址以及端口号
TransportClient client = new PreBuiltTransportClient(settings) .addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
// 关闭
client.close();
注意点:java连接elasticsearch端口号为9300,得开启elasticsearch服务,cluster.name与elasticsearch服务cluster.name得一致。
3.创建
prepareIndex(indexName, typeName, id):id可传可不传
// 创建数据
// 方式一
Map<String, Object> map = new HashMap<>();
map.put("user", "hehehe");
map.put("postDate", new Date());
map.put("message", "trying out Elasticsearch");
IndexResponse response = client.prepareIndex("twitter", "_doc")
.setSource(map)
.get();
// 方式二
XContentBuilder builder = jsonBuilder().startObject()
.field("user", "lili")
.field("postDate", new Date())
.field("message", "Elasticsearch")
.endObject();
IndexResponse response = client.prepareIndex("twitter", "_doc")
.setSource(builder)
.get();
// 方式三
String json = "{" +
"\"user\":\"zhangsan\"," +
"\"postDate\":\"2021-10-01\"," +
"\"message\":\"trying out Elasticsearch\"" +
"}";
IndexResponse response = client.prepareIndex("twitter", "_doc")
.setSource(json, XContentType.JSON)
.get();
4.查询
4.1查询index下所有数据
SearchResponse searchResponse = client.prepareSearch("twitter").get();
SearchHits searchHits = searchResponse.getHits();
SearchHit[] hits = searchHits.getHits();
for (SearchHit hit : hits) {
String sourceAsString = hit.getSourceAsString();
System.out.println(sourceAsString);
}
4.2查询type下的所有数据
SearchResponse searchResponse = client.prepareSearch("twitter").setTypes("_doc").get();
SearchHits searchHits = searchResponse.getHits();
SearchHit[] hits = searchHits.getHits();
for (SearchHit hit : hits) {
String sourceAsString = hit.getSourceAsString();
System.out.println(sourceAsString);
}
4.3查询id的数据
GetResponse response = client.prepareGet("twitter", "_doc", "1").get();
System.out.println(response);
4.4查询多个index下的所有数据
SearchResponse searchResponse = client.prepareSearch("twitter", "facebook").get();
SearchHits searchHits = searchResponse.getHits();
SearchHit[] hits = searchHits.getHits();
for (SearchHit hit : hits) {
String sourceAsString = hit.getSourceAsString();
System.out.println(sourceAsString);
}
4.5查询前缀
SearchResponse searchResponse = client.prepareSearch("twitter", "facebook").setQuery(QueryBuilders.matchQuery("user", "hehehe")).get();
SearchHits searchHits = searchResponse.getHits();
SearchHit[] hits = searchHits.getHits();
System.out.println("=========================");
for (SearchHit hit : hits) {
String sourceAsString = hit.getSourceAsString();
System.out.println(sourceAsString);
}
System.out.println("=========================");
4.6单个词查找
新增数据为:
Map<String,Object> map = new HashMap<>();
map.put("title", "love China");
map.put("content", "people very love China");
map.put("tags", "China");
IndexResponse response = client.prepareIndex("facebook", "_doc")
.setSource(map)
.get();
map.put("title", "love HuBei");
map.put("content", "people very love HuBei");
map.put("tags", "HuBei");
response = client.prepareIndex("facebook", "_doc")
.setSource(map)
.get();
进行查询
// 方法一:
SearchResponse searchResponse = client.prepareSearch("twitter", "facebook")
.setQuery(QueryBuilders.termQuery("tags", "china")).get();
SearchHits searchHits = searchResponse.getHits();
SearchHit[] hits = searchHits.getHits();
System.out.println("=========================");
for (SearchHit hit : hits) {
String sourceAsString = hit.getSourceAsString();
System.out.println(sourceAsString);
}
System.out.println("=========================");
// 方法二
SearchResponse searchResponse = client.prepareSearch("twitter", "facebook")
.setQuery(QueryBuilders.matchQuery("tags", "China")).get();
SearchHits searchHits = searchResponse.getHits();
SearchHit[] hits = searchHits.getHits();
System.out.println("=========================");
for (SearchHit hit : hits) {
String sourceAsString = hit.getSourceAsString();
System.out.println(sourceAsString);
}
System.out.println("=========================");
注意点:
1.termQuery的查询数据必须为小写,不然查不到数据。
2.termQuery和matchQuery匹配的为词,中文一个字为词,英文如果没有出现空格就为一个词
4.7 多个词查找
// 方法一
SearchResponse searchResponse = client.prepareSearch("twitter", "facebook")
.setQuery(QueryBuilders.matchPhraseQuery("title", "love China")).get();
SearchHits searchHits = searchResponse.getHits();
SearchHit[] hits = searchHits.getHits();
System.out.println("=========================");
for (SearchHit hit : hits) {
String sourceAsString = hit.getSourceAsString();
System.out.println(sourceAsString);
}
System.out.println("=========================");
// 方法二
SearchResponse searchResponse = client.prepareSearch("twitter", "facebook")
.setQuery(QueryBuilders.boolQuery()
.must(QueryBuilders.termQuery("title", "love"))
.must(QueryBuilders.termQuery("title", "china"))
).get();
SearchHits searchHits = searchResponse.getHits();
SearchHit[] hits = searchHits.getHits();
System.out.println("=========================");
for (SearchHit hit : hits) {
String sourceAsString = hit.getSourceAsString();
System.out.println(sourceAsString);
}
System.out.println("=========================");
注意点:
1.方法二查询数据必须为小写,否则查询不到数据。
2.使用termQuery查询不到数据。
3.使用matchQuery查询到两条数据,原因是因为会匹配love或china,matchQuery("love China")与termsQuery("title", "china", "love")查询结果一致。
4.8 一个查询数据查询多个字段
SearchResponse searchResponse = client.prepareSearch("twitter", "facebook")
.setQuery(QueryBuilders.multiMatchQuery("China", "tags", "title")).get();
SearchHits searchHits = searchResponse.getHits();
SearchHit[] hits = searchHits.getHits();
System.out.println("=========================");
for (SearchHit hit : hits) {
String sourceAsString = hit.getSourceAsString();
System.out.println(sourceAsString);
}
System.out.println("=========================");
注意点:查询数据只需要其中一个字段有,就返回结果
4.9 分页查询
SearchResponse searchResponse = client.prepareSearch("twitter", "facebook")
.setQuery(QueryBuilders.termQuery("title", "love"))
.setFrom(1)
.setSize(100)
.get();
SearchHits searchHits = searchResponse.getHits();
SearchHit[] hits = searchHits.getHits();
System.out.println("=========================");
for (SearchHit hit : hits) {
String sourceAsString = hit.getSourceAsString();
System.out.println(sourceAsString);
}
System.out.println("=========================");
注意点:默认从第一条开始,获取10条数据。
4.10 查询与或非
// 与
SearchResponse searchResponse = client.prepareSearch("twitter", "facebook")
.setQuery(QueryBuilders.boolQuery()
.must(QueryBuilders.termQuery("title", "hubei"))
.must(QueryBuilders.termQuery("tags", "hubei"))
)
.get();
SearchHits searchHits = searchResponse.getHits();
SearchHit[] hits = searchHits.getHits();
System.out.println("=========================");
for (SearchHit hit : hits) {
String sourceAsString = hit.getSourceAsString();
System.out.println(sourceAsString);
}
System.out.println("=========================");
// 或
SearchResponse searchResponse = client.prepareSearch("twitter", "facebook")
.setQuery(QueryBuilders.boolQuery()
.must(QueryBuilders.termQuery("title", "hubei"))
.should(QueryBuilders.termQuery("tags", "hubei"))
)
.get();
SearchHits searchHits = searchResponse.getHits();
SearchHit[] hits = searchHits.getHits();
System.out.println("=========================");
for (SearchHit hit : hits) {
String sourceAsString = hit.getSourceAsString();
System.out.println(sourceAsString);
}
System.out.println("=========================");
// 非 方式一
SearchResponse searchResponse = client.prepareSearch("twitter", "facebook")
.setQuery(QueryBuilders.boolQuery()
.mustNot(QueryBuilders.termQuery("tags", "hubei"))
.must(QueryBuilders.termQuery("title", "love"))
)
.get();
SearchHits searchHits = searchResponse.getHits();
SearchHit[] hits = searchHits.getHits();
System.out.println("=========================");
for (SearchHit hit : hits) {
String sourceAsString = hit.getSourceAsString();
System.out.println(sourceAsString);
}
System.out.println("=========================");
// 非 方式二
SearchResponse searchResponse = client.prepareSearch("twitter", "facebook")
.setQuery(QueryBuilders.boolQuery()
.must(QueryBuilders.termQuery("title", "love"))
.must(QueryBuilders.boolQuery().mustNot(QueryBuilders.termQuery("tags", "hubei")))
)
.get();
SearchHits searchHits = searchResponse.getHits();
SearchHit[] hits = searchHits.getHits();
System.out.println("=========================");
for (SearchHit hit : hits) {
String sourceAsString = hit.getSourceAsString();
System.out.println(sourceAsString);
}
System.out.println("=========================");
5.修改
根据id修改
// 方式一
String id = "4iTYE3oBrDW-b941NBEZ";
UpdateRequest request = new UpdateRequest("facebook", "_doc", id);
Map<String, Object> source = new HashMap<>();
source.put("title", "张大屌");
source.put("content", "迪奥先生");
source.put("tags", "搞笑搞笑2");
request.doc(source);
UpdateResponse response = client.update(request).get();
// 方式二
String id = "4iTYE3oBrDW-b941NBEZ";
UpdateRequest request = new UpdateRequest("facebook", "_doc", id);
XContentBuilder builder = jsonBuilder().startObject()
.field("title", "张大雕")
.field("content", "迪奥先生")
.field("tags", "哈哈哈哈哈哈")
.endObject();
request.doc(builder);
UpdateResponse response = client.update(request).get();
// 方式三
String id = "4iTYE3oBrDW-b941NBEZ";
UpdateRequest request = new UpdateRequest("facebook", "_doc", id);
String json = "{" +
"\"title\":\"张大屌\"," +
"\"content\":\"迪奥先生\"," +
"\"tags\":\"娃哈哈\"" +
"}";
request.doc(json, XContentType.JSON);
UpdateResponse response = client.update(request).get();
6.删除
6.1根据id删除
String id = "4iTYE3oBrDW-b941NBEZ";
DeleteResponse response = client.prepareDelete("facebook", "_doc", id).get();
6.2根据条件删除
filter:删除条件
source: 要删除数据的index
BulkByScrollResponse delete = DeleteByQueryAction.INSTANCE
.newRequestBuilder(client)
.filter(QueryBuilders.matchQuery("title", "china"))
.source("facebook")
.get();
注意点:查询条件为中文时,termQuery找不到数据,建议使用matchQuery。
6.3删除整个索引
client.admin().indices().prepareDelete("twitter").get();
浙公网安备 33010602011771号