java开发中elasticsearch 的简单使用

  • Post author:
  • Post category:java




elasticsearch 是什么?

如果你还不知道elasticsearch 。可以看看其他的文章分享。

或者直达官网 :

elasticsearch 官网



名词术语

要想使用elasticsearch 先要搞清楚elasticsearch 中的各个名词

本文主要介绍使用 想了解请

elasticsearch 介绍




创建索引

官方给定的是这样的

PUT /my_index
{
    "settings": { ... any settings ... },
    "mappings": {
        "type_one": { ... any mappings ... },
        "type_two": { ... any mappings ... },
        ...
    }
}

如果是linux可以使用curl 来进行创建


我使用的是windows 的postman

发送put请求 给 localhost:9200/索引名

附带json

{
  "mappings": {
      "properties": {
            "books":{
        "properties": {
            "title":{"type":"keyword"},
            "name":{"type":"keyword"}
        }
        
    }
      }
    }
}

这样就好了


发送get请求到 localhost:9200/索引名 就能看到你刚刚创建索引的详细情况




删除一个索引

用以下的请求来 删除索引:

DELETE /my_index

你也可以这样删除多个索引:

DELETE /index_one,index_two
DELETE /index_*

你甚至可以这样删除

全部

索引:

DELETE /_all
DELETE /*



多索引删除

1.在单个索引删除的基础上行使用逗号分隔多个需要删除的索引即可

DELETE product,springboot,customer

2.返回示例

{
	"acknowledged": true
}



查看索引

get 索引名

索引不存在就会返回404



查看所有索引

  • 可以通过内置_cat命令查看所有索引信息
GET _cat/indices



添加文章

有了索引就可以添加文章了

添加文章是发送post请求到 localhost:9200/索引名/_doc/添加的id

如果不带添加id 系统会随机生成一个id

根据自己索引的映射附带对应的参数

{
   "title":"test",
   "name":"zzp3"
}

添加完成之后会返回一个添加id

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-69f1Wnxy-

然后可以发送get请求 到 localhost:9200/索引名/_doc/JH7R63oBB1aDXzS50FRN [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NcIPHzE6-1627525218450)



批量查询

发送get请求 localhost:9200/索引名/_mget

带上请求体

{
   "ids":["1","RuWrl3UByGJWB5WucKtP"]
}



查询所有

get    localhost:9200/索引名/_search



文档更新



普通更新

注意,文档更新一次,version 就会自增 1。

可以直接更新整个文档:

PUT 索引名/_doc/RuWrl3UByGJWB5WucKtP
{
  "title":"666"
}

这种方式,更新的文档会覆盖掉原文档。

大多数时候,我们只是想更新文档字段,这个可以通过脚本来实现。

POST 索引名/_update/1
{
  "script": {
    "lang": "painless",
    "source":"ctx._source.title=params.title",
    "params": {
      "title":"666666"
    }
  }
}

更新的请求格式:POST {index}/_update/{id}

在脚本中,lang 表示脚本语言,painless 是 es 内置的一种脚本语言。source 表示具体执行的脚本,ctx 是一个上下文对象,通过 ctx 可以访问到

_source



_title

等。

也可以向文档中添加字段:

POST blog/_update/1
{
  "script": {
    "lang": "painless",
    "source":"ctx._source.tags=[\"java\",\"php\"]"
  }
}


删除单个文档
DELETE 索引名/_doc/1



按条件删除

POST 索引名/_delete_by_query
{
	"query": {
		"match": {
			"price": 3999
		}
	}
}



映射

  1. 有了索引库,等于有了数据库中的database
  2. 接下来就需要建索引库(index)中的映射,类似于数据库(database)中的表结构(table)
  3. 创建数据库表需要设置字段名称,类型,长度,约束等;索引库也一样,需要知道这个类型下有哪些字段,每个字段有哪些约束信息,这就叫做映射(mapping)
  4. 如果不指定映射将会默认按照给定的类型自动添加对应映射


创建时映射
  1. 可以在创建索引时指定映射

    • 其中mappings.properties为固定结构,指定创建映射属性
PUT index
{
  "mappings" : {
      "properties" : {
        "id" : {
          "type" : "long"
        },
        "title" : {
          "type" : "text"
        }
      }
  }
}



映射修改

  1. 可以对已经存在的索引添加映射
  2. 需要使用 PUT /_mapping
  3. 修改时只需要指定properties即可,不需要指定mappings
PUT index/_mapping
{
  "properties" : {
    "id" : {
      "type" : "long"
    },
    "title" : {
      "type" : "text"
    }
  }
}
复制代码



查看映射

1.查看索引完全信息,内容包含映射信息

GET index

2.指定查询索引信息

GET index/_mapping

通过上面的学习和使用已经大概了解和使用了elasticsearch了

那么通过java来使用下吧



JavaApi集成查询



1、新建maven项目

添加相关依赖

<dependencies>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13</version>
  </dependency>
  <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.74</version>
  </dependency>
  <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.18</version>
  </dependency>

  <!-- es服务依赖 -->
  <dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>7.8.0</version>
  </dependency>
  <!-- es客户端依赖 -->
  <dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.8.0</version>
  </dependency>
</dependencies>



2、新建索引操作类
/**
 * @author zzp
 * @create 2021-07-28-15:14
 */
public class ElasticsearchIndexTest {

    /**
     * 连接客户端
     */
    private RestHighLevelClient client;

    /**
     * 初始化客户端
     * before 是指定在test方法运行前运行
     */
    @Before
    public void init(){
        HttpHost serverHost = new HttpHost("localhost",9200);
        client = new RestHighLevelClient(RestClient.builder(serverHost));
    }

    /**
     * 销毁客户端
     * 在test方法执行后执行
     */
    @After
    public void destroy(){
        if (Objects.isNull(client)){
            try {
                client.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 创建索引:有则报错,无则新建
     */
    @Test
    public void testCreate() throws IOException {
        CreateIndexRequest createIndexRequest = new CreateIndexRequest("javatest");
        CreateIndexResponse createIndexResponse = client.indices().create(createIndexRequest, RequestOptions.DEFAULT);
        System.out.println(createIndexResponse.toString());
    }
    /**
     * 查询索引信息
     */
    @Test
    public void testQuery() throws IOException {
        GetIndexRequest request = new GetIndexRequest("javatest");
        GetIndexResponse response = client.indices().get(request, RequestOptions.DEFAULT);
        // 获取别名
        System.out.println(response.getAliases().toString());
        // 获取默认设置
        System.out.println(response.getDefaultSettings().toString());
        // 获取索引信息
        System.out.println(response.getIndices().toString());
        // 获取映射信息
        System.out.println(response.getMappings().toString());
    }


    /**
     * 删除索引
     */
    @Test
    public void testDelete() throws IOException {
        DeleteIndexRequest request = new DeleteIndexRequest("javatest");
        AcknowledgedResponse response = client.indices().delete(request, RequestOptions.DEFAULT);
        System.out.println(response.toString());
    }
    
}



文档操作
/**
 * @author zzp
 * @create 2021-07-28-15:38
 * 文档操作
 */
public class ElasticsearchDocTest {
    /**
     * 连接客户端
     */
    private RestHighLevelClient client;

    /**
     * 初始化客户端
     */
    @Before
    public void init(){
        HttpHost serverHost = new HttpHost("localhost",9200);
        client = new RestHighLevelClient(RestClient.builder(serverHost));
    }

    /**
     * 销毁客户端
     */
    @After
    public void destroy(){
        if (Objects.isNull(client)){
            try {
                client.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 创建文档
     */
    @Test
    public void testCreate() throws IOException {
        IndexRequest request = new IndexRequest();
        // 指定索引
        request.index("java");
        // 指定id
        request.id("1001");
        // 存储数据
        //这里是自定义的一个类 具体看自己mapping中的映射来
        EsUser user = new EsUser("zhangsan", 30, "男");
        // 指定source内容
        request.source(user.toJsonString(), XContentType.JSON);
        // 请求
        IndexResponse response = client.index(request, RequestOptions.DEFAULT);
        PrintUtil.buttyPrint(response);
    }

    /**
     * 修改文档
     */
    @Test
    public void testUpdate() throws IOException {
        UpdateRequest request = new UpdateRequest();
        // 指定索引
        request.index("java");
        // 指定id
        request.id("1001");

        // 更新内容
        EsUser user = new EsUser("ES", 18, "女");
        request.doc(user.toJsonString(), XContentType.JSON);

        // ES请求
        UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
        PrintUtil.buttyPrint(response);
    }

    /**
     * 文档查询
     */
    @Test
    public void testQuery() throws IOException {
        GetRequest request = new GetRequest().index("java").id("1001");
        GetResponse response = client.get(request, RequestOptions.DEFAULT);
        PrintUtil.buttyPrint(response.getSource());
    }

    /**
     * 删除文档
     */
    @Test
    public void testDelete() throws IOException {
        DeleteRequest request = new DeleteRequest().index("java").id("1001");
        DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);
        PrintUtil.buttyPrint(response);
    }

    /**
     * 批量操作,针对于增删改
     */
    @Test
    public void testBatch() throws IOException {
        BulkRequest bulkRequest = new BulkRequest();
        // 先删除
        bulkRequest.add(new DeleteRequest().index("java").id("1001"));
        // 再添加
        EsUser user = new EsUser("EsJava", 18, "男");
        bulkRequest.add(new IndexRequest().index("java").id("1002").source(user.toJsonString(), XContentType.JSON));

        BulkResponse responses = client.bulk(bulkRequest, RequestOptions.DEFAULT);
        System.out.println(responses);
    }

    /**
     * match查询
     */
    @Test
    public void testAdvanceMatchQuery() throws IOException {
        SearchRequest request = new SearchRequest("java");

        // 查询条件构造
        SearchSourceBuilder builder = new SearchSourceBuilder();

        // 匹配查询
        /// QueryBuilders提供命令中的查询匹配关系
        /// 查询所有
        /// QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
        /// 单个查询
        /// QueryBuilder queryBuilder = QueryBuilders.matchQuery("age", 18);
        /// 短语匹配查询
        QueryBuilder queryBuilder = QueryBuilders.matchPhraseQuery("name", "EsJava");
        builder.query(queryBuilder);

        request.source(builder);
        SearchResponse responses = client.search(request, RequestOptions.DEFAULT);
        System.out.println(responses.getHits());
    }

    /**
     * bool查询
     */
    @Test
    public void testAdvanceBoolQuery() throws IOException {
        SearchRequest request = new SearchRequest("java");

        // 查询条件构造
        SearchSourceBuilder builder = new SearchSourceBuilder();
        BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();

        // must
        queryBuilder.must(QueryBuilders.matchQuery("age", 18));
        // mustNot
        queryBuilder.mustNot(QueryBuilders.matchQuery("sex", "女"));
        // should
        queryBuilder.should(QueryBuilders.matchQuery("name", "zhangsan"));

        builder.query(queryBuilder);
        request.source(builder);
        SearchResponse responses = client.search(request, RequestOptions.DEFAULT);
        System.out.println(responses.getHits());
    }

    /**
     * 分页查询
     */
    @Test
    public void testAdvancePageQuery() throws IOException {
        SearchRequest request = new SearchRequest("java");

        // 查询条件构
        SearchSourceBuilder builder = new SearchSourceBuilder();
        MatchAllQueryBuilder queryBuilder = QueryBuilders.matchAllQuery();

        // query <==> select
        builder.query(queryBuilder);

        // 分页查询
        builder.from(0);
        builder.size(2);

        // 指定排序
        builder.sort("age", SortOrder.ASC);

        request.source(builder);
        SearchResponse responses = client.search(request, RequestOptions.DEFAULT);
        for (SearchHit searchHit : responses.getHits()) {
            System.out.println(searchHit.getSourceAsString());
        }
    }

    /**
     * 高亮查询
     */
    @Test
    public void testAdvanceHighLightQuery() throws IOException {
        SearchRequest request = new SearchRequest("java");

        // 查询条件构
        SearchSourceBuilder builder = new SearchSourceBuilder();
        // 注意高亮全部查询时无意义
        MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery("name", "java");
        builder.query(queryBuilder);

        // 高亮搜搜,和查询同级
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.preTags("<font color='red'>");
        highlightBuilder.postTags("</font>");
        highlightBuilder.field("name");

        builder.highlighter(highlightBuilder);
        request.source(builder);
        SearchResponse responses = client.search(request, RequestOptions.DEFAULT);
        for (SearchHit searchHit : responses.getHits()) {
            System.out.println(searchHit.getHighlightFields());
        }
    }


}



版权声明:本文为qq_26387051原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。