Elasticsearch基础学习(Java API 实现增删查改)

这篇具有很好参考价值的文章主要介绍了Elasticsearch基础学习(Java API 实现增删查改)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、概述

ElasticSearch,简称为ES, ES是一个开源的高扩展的分布式全文搜索引擎。它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。

物理设计:
ElasticSearch 在后台把每个索引划分成多个分片,每份分片可以在集群中的不同服务器间迁移。

逻辑设计:
一个索引类型中,包含多个文档,比如说文档1,文档2,文档3。当我们索引一篇文档时,可以通过这样的一个顺序找到它: 索引 -▷ 类型 -▷ 文档ID ,通过这个组合我们就能索引到某个具体的文档。

二、环境搭建

下载安装elasticsearch-6.8.13、es-head-chrome插件。
下载ES相关插件,将插件放置plugins目录下:
es 增删查改 java,elasticsearch,学习,搜索引擎,java,restful

三、ES启动

启动命令:elasticsearch.bat
es 增删查改 java,elasticsearch,学习,搜索引擎,java,restful

若能成功访问 http://loaclhost:9200,则启动成功
es 增删查改 java,elasticsearch,学习,搜索引擎,java,restful

可通过 es-head-chrome插件查看ES后台:

es 增删查改 java,elasticsearch,学习,搜索引擎,java,restful
es 增删查改 java,elasticsearch,学习,搜索引擎,java,restful

启动kibana:
es 增删查改 java,elasticsearch,学习,搜索引擎,java,restful
es 增删查改 java,elasticsearch,学习,搜索引擎,java,restful

访问:http://localhost:5601
在开发工具中,可执行Rest命令
es 增删查改 java,elasticsearch,学习,搜索引擎,java,restful

四、Springboot项目搭建

创建Springboot项目:
es 增删查改 java,elasticsearch,学习,搜索引擎,java,restful

五、添加ES依赖

设置ES版本:

<properties>
   <java.version>1.8</java.version>
   <elasticsearch.version>6.8.13</elasticsearch.version>
</properties>

导入ES依赖,JSON依赖:

<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>fastjson</artifactId>
   <version>1.2.54</version>
</dependency>

<dependency>
   <groupId>org.elasticsearch.client</groupId>
   <artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>
<dependency>
   <groupId>org.elasticsearch.client</groupId>
   <artifactId>elasticsearch-rest-client</artifactId>
</dependency>
<dependency>
   <groupId>org.elasticsearch</groupId>
   <artifactId>elasticsearch</artifactId>
</dependency>

六、编写配置类

@Configuration
public class config {
    @Bean
    public RestHighLevelClient restHighLevelClient() {
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("127.0.0.1", 9200, "http")));
        return client;
    }
}

七、创建索引

@Test
void testCreateIndex() throws IOException {
   HttpHost host = HttpHost.create("http://localhost:9200");
   RestClientBuilder builder = RestClient.builder(host);
   client = new RestHighLevelClient(builder);

   CreateIndexRequest request = new CreateIndexRequest("user");
   client.indices().create(request, RequestOptions.DEFAULT);

   client.close();
}

八、增删改操作

1、基本Rest命令说明(增、删、改、查命令):

menthod ur地址 描述
PUT localhost:9200/索引名称/类型名称/文档id 创建文档(指定文档id)
POST localhost:9200/索引名称/类型名称 创建文档(随机文档id)
POST localhost:9200/索引名称/类型名称/文档id/_update 修改文档
DELETE localhost:9200/索名称/类型名称/文档id 删除文档
GET localhost:9200/索引名称/类型名称/文档id 查询文档通过文档id
POST localhost:9200/索引名称/类型名称/_search 查询所有数据

2、添加文档记录

添加单条记录

@Test
void testAddDoc() throws IOException {
   // 1.要在指定索引下创建文档,所以要先创建索引,再创建文档
   IndexRequest request=new IndexRequest();
   // index()方法设置索引名;id()方法设置唯一id标识
   request.index("user").id("10001").type("text");
   // 2.创建实体类对象,填充数据
   User user=new User();
   user.setName("张三丰");
   user.setAge(30);
   // 3.利用jackson将实体类对象转换成JSON格式字符串
   request.source(JSON.toJSONString(user), XContentType.JSON);
   // 5.发送请求,获取响应结果
   IndexResponse response = client.index(request, RequestOptions.DEFAULT);
   System.out.println("_index: "+response.getIndex());
   System.out.println("_id: "+response.getId());
   System.out.println("_result: "+response.getResult());
}

批量添加记录

	@Test
	void testBulkRequest()throws IOException{

		BulkRequest bulkRequest = new BulkRequest();
		ArrayList<Employee> users = new ArrayList<>();
//		users.add(new Employee("李文",23,"研发工程师","2352"));
//		users.add(new Employee("罗文",17,"测试工程师","8732"));
//		users.add(new Employee("徐洁",22,"算法工程师","8791"));
//		users.add(new Employee("罗辑",31,"高级研发工程师","8765"));
//		users.add(new Employee("叶文洁",70,"资深研发工程师","8551"));

		users.add(new Employee("小猪佩奇",23,"猪","2"));
		users.add(new Employee("小猪",17,"佩奇","4"));
		users.add(new Employee("测试",22,"小","6"));
		users.add(new Employee("xiaozhubeiqi",31,"peiqi","8"));
		users.add(new Employee("小猪佩佩",70,"小猪佩祺过大年","10"));
		users.add(new Employee("小猪珮奇",23,"小猪佩祺过大年","12"));
		users.add(new Employee("小猪佩奇",23,"小猪佩奇过大年","14"));

		for(int i = 0;i< users.size();i++){
			bulkRequest.add(new IndexRequest("pig").id(""+(i+1)).type("pinyin")
					.source(JSON.toJSONString(users.get(i)),XContentType.JSON));
		}
		BulkResponse bulkResponse = client.bulk(bulkRequest,RequestOptions.DEFAULT);
		System.out.println(!bulkResponse.hasFailures());
	}

3、更新文档记录

@Test
void testUpdateDoc() throws IOException
{
   UpdateRequest request = new UpdateRequest("test_index","random","1");
   User user = new User("张三",18,"003");
   request.doc(JSON.toJSONString(user), XContentType.JSON);
   UpdateResponse updateResponse = client.update(request, RequestOptions.DEFAULT);
   System.out.println(updateResponse.status() == RestStatus.OK);
}

4、删除文档记录

@Test
void testDelete() throws IOException {
   HttpHost host = HttpHost.create("http://localhost:9200");
   client = new RestHighLevelClient(RestClient.builder(host));

   DeleteRequest request = new DeleteRequest("test_index","random","1");
   DeleteResponse deleteResponse = client.delete(request, RequestOptions.DEFAULT);
   System.out.println(deleteResponse.status() == RestStatus.OK);
}

九、高级查询

1、排序查询

	/**
	 * 排序查询(sort) 代码同matchAllQuery
	 * 匹配查询符合条件的所有数据,并设置分页
	 */
	@Test
	public void sortQuery() {
		try {
			// 构建查询条件
			MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
			// 创建查询源构造器
			SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
			searchSourceBuilder.query(matchAllQueryBuilder);
//			// 设置分页
//			searchSourceBuilder.from(0);
//			searchSourceBuilder.size(3);
			// 设置排序
			searchSourceBuilder.sort("id", SortOrder.ASC);
			// 创建查询请求对象,将查询对象配置到其中
			SearchRequest searchRequest = new SearchRequest("employee_alias");
			searchRequest.source(searchSourceBuilder);
			// 执行查询,然后处理响应结果
			SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
			// 根据状态和数据条数验证是否返回了数据
			if (RestStatus.OK.equals(searchResponse.status())) {
				SearchHits hits = searchResponse.getHits();
				for (SearchHit hit : hits) {
					// 将 JSON 转换成对象
					Employee userInfo = JSON.parseObject(hit.getSourceAsString(), Employee.class);
					// 输出查询信息
					log.info(userInfo.toString());
				}
			}
		} catch (IOException e) {
			log.error("", e);
		}
	}

2、聚合查询(一)

查询30岁以上、30岁及以下员工的平均年龄:

@Test
public void bucketQuery() {
      // 创建查询源构造器
      SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
      // 创建查询请求对象,将查询对象配置到其中
      SearchRequest searchRequest = new SearchRequest("employee");

      RangeAggregationBuilder rangeAggregationBuilder = AggregationBuilders.range("age_ranges_avg")
            .field("age")
            .addRange(0, 30)
            .addRange(31, 100).subAggregation(AggregationBuilders.avg("avgAge").field("age"));
      searchSourceBuilder.aggregation(rangeAggregationBuilder);
      searchRequest.source(searchSourceBuilder);
      SearchResponse response;
      try {
         //发起请求,获取响应结果
         response = client.search(searchRequest, RequestOptions.DEFAULT);
         //获取聚合的结果
         Aggregations aggregations = response.getAggregations();
         Aggregation aggregation = aggregations.get("age_ranges_avg");
         System.out.println(JSON.toJSONString(aggregation));
         //获取桶聚合结果
         List<? extends Range.Bucket> buckets = ((Range) aggregation).getBuckets();
         //循环遍历各个桶结果
         for (Range.Bucket bucket : buckets) {
            //分组的key
            String key = bucket.getKeyAsString();
            //分组的值
            long docCount = bucket.getDocCount();
            ParsedAvg avgAge = bucket.getAggregations().get("avgAge");

            System.out.println(key + "======平均年龄:" + avgAge.getValue() + "======数量:" + docCount);
         }
      } catch (IOException e) {
         e.printStackTrace();
      }

}

3、聚合查询(二)

	/**
	 * 聚合查询
	 * Metric 指标聚合分析
	 */
	@Test
	public void metricQuery() {
		try {
			// 构建查询条件
			MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
			// 创建查询源构造器
			SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
			searchSourceBuilder.query(matchAllQueryBuilder);

			// 获取最贵的商品
			AggregationBuilder maxAge = AggregationBuilders.max("maxAge").field("age");
			searchSourceBuilder.aggregation(maxAge);
			// 获取最便宜的商品
			AggregationBuilder minAge = AggregationBuilders.min("minAge").field("age");
			searchSourceBuilder.aggregation(minAge);

			// 创建查询请求对象,将查询对象配置到其中
			SearchRequest searchRequest = new SearchRequest("employee");
			searchRequest.source(searchSourceBuilder);
			// 执行查询,然后处理响应结果
			SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
			Aggregations aggregations = searchResponse.getAggregations();
			ParsedMax max = aggregations.get("maxAge");
			log.info("最年长:" + max.getValue());
			ParsedMin min = aggregations.get("minAge");
			log.info("最年轻:" + min.getValue());
		} catch (IOException e) {
			log.error("", e);
		}
	}

4、模糊查询

	//模糊查询,原理是构建DFA,查询名字中含有“文”的员工
	@Test
	public void fuzzyQuery() {
		try {
			// 构建查询条件
			SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
			searchSourceBuilder.query(QueryBuilders.fuzzyQuery("name", "洁").fuzziness(Fuzziness.AUTO));
			// 创建查询请求对象,将查询对象配置到其中
			SearchRequest searchRequest = new SearchRequest("employee");
			searchRequest.source(searchSourceBuilder);
			// 执行查询,然后处理响应结果
			SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
			// 根据状态和数据条数验证是否返回了数据
			if (RestStatus.OK.equals(searchResponse.status())) {
				SearchHits hits = searchResponse.getHits();
				for (SearchHit hit : hits) {
					// 将 JSON 转换成对象
					Employee userInfo = JSON.parseObject(hit.getSourceAsString(), Employee.class);
					// 输出查询信息
					log.info(userInfo.toString());
				}
			}
		} catch (IOException e) {
			log.error("", e);
		}
	}

5、范围查询

//查询20岁以上的员工
	@Test
	public void rangeQuery() {
		try {
			// 构建查询条件
			SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
			searchSourceBuilder.query(QueryBuilders.rangeQuery("age").gte(20));
			// 创建查询请求对象,将查询对象配置到其中
			SearchRequest searchRequest = new SearchRequest("employee");
			searchRequest.source(searchSourceBuilder);
			// 执行查询,然后处理响应结果
			SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
			// 根据状态和数据条数验证是否返回了数据
			if (RestStatus.OK.equals(searchResponse.status()) ) {
				SearchHits hits = searchResponse.getHits();
				//log.info(hits.getTotalHits().value + "");
				for (SearchHit hit : hits) {
					// 将 JSON 转换成对象
					Employee userInfo = JSON.parseObject(hit.getSourceAsString(), Employee.class);
					// 输出查询信息
					log.info(userInfo.toString());
				}
			}
		} catch (IOException e) {
			log.error("", e);
		}
	}

6、多字段查询

multi_match进行多字段匹配查询,进行权重控制文章来源地址https://www.toymoban.com/news/detail-790842.html

GET pig/_search
{
  "query": {
    "multi_match": {
      "query": "小猪佩奇",
      "fields": ["name^3","occupation"]
    }
  }
}
@Test
	public void matchQuery() {
		try {
			// 构建查询条件
			SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

			Map<String,Float> fields = new HashMap(2);
			fields.put("name", 1.0f);
			fields.put("occupation", 1.0f);
//			QueryBuilder queryBuilder = null;
//			queryBuilder.must(QueryBuilders.multiMatchQuery("name","小猪佩奇").fields(fields).analyzer("ik_smart"));
			searchSourceBuilder.query(QueryBuilders.multiMatchQuery("小猪佩奇","name","occupation").fields(fields).analyzer("pinyin"));


			// 创建查询请求对象,将查询对象配置到其中
			SearchRequest searchRequest = new SearchRequest("pig");
			searchRequest.source(searchSourceBuilder);
			// 执行查询,然后处理响应结果
			SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
			// 根据状态和数据条数验证是否返回了数据
			if (RestStatus.OK.equals(searchResponse.status()) ) {
				SearchHits hits = searchResponse.getHits();
				for (SearchHit hit : hits) {
					// 将 JSON 转换成对象
					Employee userInfo = JSON.parseObject(hit.getSourceAsString(), Employee.class);
					// 输出查询信息
					log.info(userInfo.toString());
				}
			}
		} catch (IOException e) {
			log.error("", e);
		}
	}

到了这里,关于Elasticsearch基础学习(Java API 实现增删查改)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Mybatis基础---------增删查改

    目录结构 增删改 1、新建工具类用来获取会话对象 2、加入junit依赖 3、通过映射传递属性 之前的sql语句全部写在了映射文件中,然而在实际应用时是通过映射传递属性的,也就是java对象对应sql语句中的占位符属性,属性名一般和java对象中的属性名相同,我们只需要用#{}作为

    2024年01月17日
    浏览(46)
  • 【MySQL】增删查改基础

    需要云服务器等云产品来学习Linux的同学可以移步/--腾讯云--/--阿里云--/--华为云--/官网,轻量型云服务器低至112元/年,新用户首次下单享超低折扣。    目录 一、Create(创建) 1、insert(插入) 1.1单行数据插入 1.2多行数据插入 1.3插入或者替换更新 2、replace(替换) 二、Retrieve(读取

    2024年02月09日
    浏览(50)
  • [ MySQL ] — 基础增删查改的使用

    目录 表的增删查改 Create 单行数据 全列插入 多行数据 全列插入 多行数据 指定列插入 不存在插入存在则更新 替换  Retrieve SELECT 列   全列查询 指定列查询 查询字段为表达式  为查询结果指定别名 结果去重 WHERE 条件  结果排序 筛选结果分页 Update  Delete  删除数据 截断表

    2024年02月12日
    浏览(55)
  • 【Elasticsearch学习笔记五】es常用的JAVA API、es整合SpringBoot项目中使用、利用JAVA代码操作es、RestHighLevelClient客户端对象

    目录 一、Maven项目集成Easticsearch 1)客户端对象 2)索引操作 3)文档操作 4)高级查询 二、springboot项目集成Spring Data操作Elasticsearch 1)pom文件 2)yaml 3)数据实体类 4)配置类 5)Dao数据访问对象 6)索引操作 7)文档操作 8)文档搜索 三、springboot项目集成bboss操作elasticsearch

    2023年04月09日
    浏览(51)
  • ES es Elasticsearch 十三 Java api 实现搜索 分页查询 复杂查询 过滤查询 ids查询 等

    目录 Java api 实现搜索 Pom.xml 建立链接 搜索全部记录 增加规则值查某些字段 搜索分页 全代码 Ids 搜索 搜索Match搜索 multi_match 搜索 多字段搜索 复杂查询 bool查询 filter  bool 复杂查询增加过滤器查询 复杂擦好像加排序 日志 思路 参考 api 写法 写Java代码 请求条件构建层次

    2024年02月04日
    浏览(60)
  • 认识Mybatis并实现增删查改

    目录 一.Mybatis特性 二.常见持久层技术的比较 三.搭建Mybaits环境 四.使用Mybatis  五.通过Mybatis实现增删改  六.实现数据库的查询操作 定制化SQL:MyBatis允许开发人员编写、优化和管理自定义的SQL语句,可以满足复杂查询和存储过程等高级操作的需求。 避免JDBC代码:MyBatis抽象了

    2024年02月12日
    浏览(42)
  • java springboot整合MyBatis演示增删查改操作

    前面我的文章 java springboot整合MyBatis做数据库查询操作讲述了整合springboot整合MyBatis 做了根据id查询的语句 那么 我们现在按它搭建的项目继续 我们在staffDao中添加一个insert函数 参考代码如下 Insert需要手动导包 import org.apache.ibatis.annotations.Insert; 这就是一个添加语句函数 返回一

    2024年02月11日
    浏览(50)
  • 带头 + 双向 + 循环链表增删查改实现

    目录 源码: List.c文件: List.h文件: 简单的测试: 很简单,没什么好说的,直接上源码。

    2024年01月23日
    浏览(46)
  • C++:vector增删查改模拟实现

    提前在这说明下,vector增删查改模拟实现的成员变量博主采用 SGI版本 。下面给出其库中成员变量是哪些,后续的模拟实现都基于此。 我们发现库中定义了3个T*的变量。同时3个成员变量的意义如下: 我们先来看看vector库中的构造类型如下: 我们知道有三种构造方式,下面给

    2024年02月05日
    浏览(44)
  • C++:list增删查改模拟实现

    本篇博客采用SGI版本,同时考虑到看到此篇博客大部分为初学者,为此博主仅仅给出有用片段。 C++:list增删查改模拟实现就是用C++复写双链表,非常简单。难点主要在迭代器实现 list底层使用什么数据结构来实现的呢?我们先来看看SGI库中list的成员函数和初始化吧。 我们发现

    2024年02月04日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包