绊夏微凉

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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();
posted on 2021-06-17 16:25  绊夏微凉  阅读(85)  评论(0)    收藏  举报