Java 操作ElasticSearch

这篇具有很好参考价值的文章主要介绍了Java 操作ElasticSearch。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        Java REST提供了两种风格的客户端连接工具,Java High Level REST Client、Java Low Level REST Client,这里我就不去细说Java Low Level REST Client了,因为这我确实没用到过,也不是很了解,我说一下Java High Level REST Client。

Java High Level REST Client ​​​​      

        首先如果你喜欢看官方文档的话,我把地址粘贴在这里,官网讲的也比较详细:Java High Level REST Client | Java REST Client [7.4] | Elastic

第一步添加依赖:

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.elasticsearch.client/elasticsearch-rest-high-level-client -->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.4.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.elasticsearch.client/elasticsearch-rest-client -->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-client</artifactId>
            <version>7.4.0</version>
        </dependency>

        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>7.4.0</version>
        </dependency>

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

第二步:

在配置文件添加对应的地址以及端口:

elasticsearch:
  host: 127.0.0.1
  port: 9200

 第三步使用:

1.创建一个索引

	@Autowired
	private RestHighLevelClient client;  //注入client、后面的代码会省略
	
  @Test
	public void addIndexAndmapping() throws IOException {
		IndicesClient indices = client.indices();
		//创建索引
		CreateIndexRequest createIndexRequest = new CreateIndexRequest("test_index");
		//设置分片数量以及副本数量
		createIndexRequest.settings(Settings.builder()
				.put("index.number_of_shards", 3)
				.put("index.number_of_replicas", 2)
		);
		//添加映射,相当于给表创建字段
		String mapping  ="{properties={address={analyzer=ik_max_word, type=text}, name={type=keyword}, age={type=integer}}}";
		System.out.println(mapping);
		createIndexRequest.mapping(mapping, XContentType.JSON);
		CreateIndexResponse response = indices.create(createIndexRequest, RequestOptions.DEFAULT);//创建索引
		System.out.println(response.isAcknowledged());
	}

2.查询某个索引的信息

	@Test
	public void queryIndex() throws IOException {
		IndicesClient indices = client.indices();
		GetIndexRequest getIndexRequest = new GetIndexRequest("person");
		GetIndexResponse getIndexResponse = indices.get(getIndexRequest, RequestOptions.DEFAULT);
		Map<String, MappingMetaData> mappings = getIndexResponse.getMappings();
		mappings.forEach((k,v)->{
			System.out.println("key:"+k+",v:"+v.getSourceAsMap());
		});
	}

3.添加文档

	@Test
	public void addDoc() throws IOException {
		//数据对象
		Person p = new Person();
		p.setName("meiting");
		p.setAddress("sichuan");
		p.setAge(22);
		IndexRequest request = new IndexRequest("person").id("1").source(JSON.toJSONString(p),XContentType.JSON);
		IndexResponse index = client.index(request, RequestOptions.DEFAULT);
	}

4.修改文档

就跟添加文档一样,在es中如果指定文档的id存在就会就会更新这个文档。操作方式跟上面添加文档一样,不过需要指定文档的id。

5.查询操作

5.1根据id查询文档或者删除文档

 @Test
	public void findDocByID() throws IOException {
		GetRequest getIndexRequest = new GetRequest("person","1");
		GetResponse documentFields = client.get(getIndexRequest, RequestOptions.DEFAULT);
		System.out.println(documentFields.getSourceAsString());
	}
  //根据id删除文档
	@Test
	public void delDocByID() throws IOException {
		DeleteRequest deleteRequest = new DeleteRequest("person","1");
		DeleteResponse documentFields = client.delete(deleteRequest, RequestOptions.DEFAULT);
		System.out.println(documentFields.getId());
	}

5.2查询所有文档

	@Test
	public void findAllDoc() throws IOException {
		SearchRequest sr = new SearchRequest("person");

		SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
		sourceBuilder.from(0).size(20);//指定分页
		MatchAllQueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
		sourceBuilder.query(queryBuilder);
		sr.source(sourceBuilder);
		SearchResponse search = client.search(sr, RequestOptions.DEFAULT);
		System.out.println(search.getHits().getTotalHits()); //查询到的所有的文档数量
		SearchHits hits = search.getHits();
		hits.forEach(ele->{
			System.out.println(ele.getSourceAsString());
		});
	}

5.3term查询(词条查询) text支持分词,keyword不支持分词

    @Test
	public void termQuery() throws IOException {
		SearchRequest requst = new SearchRequest("person");
		SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

		QueryBuilder queryBuilder = QueryBuilders.termQuery("name","阿");
		sourceBuilder.query(queryBuilder);

		requst.source(sourceBuilder);
		SearchResponse search = client.search(requst, RequestOptions.DEFAULT);

		SearchHit[] hits = search.getHits().getHits();
		for (SearchHit hit : hits) {
			System.out.println(hit.getSourceAsString());
		}
	}
/** 类似于
get person/_search
{
  "query":{
    "term":{
      "name":{
        "value":"阿"
      }
    }
  }
}
*/

5.4match查询

	@Test
	public void matchQuery() throws IOException {
		SearchRequest requst = new SearchRequest("person");
		SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
		MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery("name", "老板");
		queryBuilder.operator(Operator.AND);//求并集
		sourceBuilder.query(queryBuilder);
		requst.source(sourceBuilder);
		SearchResponse search = client.search(requst, RequestOptions.DEFAULT);
		SearchHit[] hits = search.getHits().getHits();
		for (SearchHit hit : hits) {
			System.out.println(hit.getSourceAsString());
		}
	}
/**类似于
get person/_search
{
  "query":{
    "match": {
      "name": {
        "query":"永恩",
        "operator": "and"
      }
    }
  }
}
*/

5.5模糊查询

wildcard查询:会对查询条件进行分词。还可以使用通配符 ?(任意单个字符) *(0个或者多个字符)

regexp查询:正则查询

prefix查询:前缀查询

	@Test
	public void wildSearch() throws IOException {
		SearchRequest requst = new SearchRequest("person");
		SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

		QueryBuilder queryBuilder = QueryBuilders.wildcardQuery("name","菲*");
		//QueryBuilder queryBuilder = QueryBuilders.regexpQuery("name","菲*");  //正则查询
		//QueryBuilder queryBuilder = QueryBuilders.prefixQuery("name","菲"); //前缀查询
		sourceBuilder.query(queryBuilder);
		requst.source(sourceBuilder);
		SearchResponse search = client.search(requst, RequestOptions.DEFAULT);
		SearchHit[] hits = search.getHits().getHits();
		for (SearchHit hit : hits) {
			System.out.println(hit.getSourceAsString());
		}
	}

5.6范围查询

range范围查询:查找指定字段在指定范围内包含值。查询年龄20到26的人并排序

	@Test
	public void rangeQuery() throws IOException {
		SearchRequest requst = new SearchRequest("person");

		SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
		QueryBuilder queryBuilder = QueryBuilders.rangeQuery("age").gte(20).lte(26);
		sourceBuilder.query(queryBuilder);
		sourceBuilder.sort("age", SortOrder.DESC); //排序
		requst.source(sourceBuilder);
		SearchResponse search = client.search(requst, RequestOptions.DEFAULT);
		SearchHit[] hits = search.getHits().getHits();
		for (SearchHit hit : hits) {
			System.out.println(hit.getSourceAsString());
		}
	}
/**类似于
get person/_search
{
  "query":{
    "range": {
      "age": {
        "gte": 20,
        "lte": 24
      }
    }
  },
  "sort":[  //排序
    {
      "age":{
        "order":"desc"
      }
    }
    ]
}
*/

5.7querySt ring查询

queryString查询就是:对查询条件进行分词,然后将分词后的查询条件和词条进行等值匹配。然后取并集。

这种查询的特点就是可以指定多个字段查询。比如下面就是查名字和地址中包含“老”的数据。

	@Test
	public void queryStringQuery() throws IOException {
		SearchRequest requst = new SearchRequest("person");

		SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

		QueryBuilder queryBuilder = QueryBuilders.queryStringQuery("老").field("name").field("address").defaultOperator(Operator.OR);
		sourceBuilder.query(queryBuilder);
		sourceBuilder.sort("age", SortOrder.DESC); //排序
		requst.source(sourceBuilder);
		SearchResponse search = client.search(requst, RequestOptions.DEFAULT);
		SearchHit[] hits = search.getHits().getHits();
		for (SearchHit hit : hits) {
			System.out.println(hit.getSourceAsString());
		}
	}
/**类似于
get person/_search
{
  "query":{
    "query_string": {
      "fields": ["name","address"],
      "query": "永恩 OR 瑟提"
    }
  }
}
*/

        除了上面说的这些常用的查询操作外还包括许多其他的查询,比如说聚合查询、高亮查询等等。在官网都可以查到对应的例子。到时候可以去官网看对应的例子。

Java 操作ElasticSearch

Spring Data 操作ES 

Spring Data也提供了操作ES数据库的功能,因为我们现在的项目基本都是基于Spring的,所以集成这个功能之后很多项目在考虑选择的时候也会把这种方式考了进来,我之前参与的项目就是采用的这种方式来操作ES数据库的。

1.搭建环境

添加依赖:添加依赖的时候要注意版本的选择,要选择对应的版本,参考官网Spring Data Elasticsearch - Reference Documentation

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.11</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>springDataEs</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>
    <name>springDataEs</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

然后第二步配置文件

spring.elasticsearch.rest.uris=127.0.0.1:9200 

前面要做的步骤就这两步。

2.实际操作

2.1创建实体以及接口 

@Document(indexName = "animal",createIndex = true,shards = 1,replicas = 1)
@Data
public class Animal {
    @Id
    private long id;

    @Field(type= FieldType.Text)
    private String name;

    @Field(type=FieldType.Text)
    private String address;

    @Field(type = FieldType.Integer)
    private int age;
}

这上面需要注意的就是几个注解:

  • @Document 注解作用在类上,说明这是一个文档对象。

        indexName:索引名称

        createIndex:是否需要创建索引,若为true就会自动创建索引

        shards、replicas:分片数量和副本数量

  • @Field(type= FieldType.Text)

    在es对应的这个字段的数据类型,这里FieldType.Tex在es创建后这个字段就对应为text类型的。

2.2创建存储库接口

创建了这个接口并继承ElasticsearchRepository之后,就可以使用了。

public interface AnimalRepostory extends ElasticsearchRepository<Animal,Long> {
}

继承关系:

Java 操作ElasticSearch

然后就可以基本的使用了,步骤非常简单。。。

2.3新增文档 

我新写了一个接口,去尝试添加一个文档。

    @PostMapping("addDoc")
    public void addDoc(){
        Animal animal = new Animal();
        animal.setId(1);
        animal.setName("tew");
        animal.setAddress("111");
        animal.setAge(12);
        animalRepostory.save(animal);
    }

效果

Java 操作ElasticSearch

可以看到,我们添加文档成功了,这个索引也自动给我们创建了。

Spring Data ElasticSearch对ES的操作进行了很完美的包装,他是基于Java High Level REST Client写的,使用起来非常方便。这里我就不对其他的方法进行讲解了,它的crud自己去搭建个环境跑起来,只要环境搭好之后后面就很方便了。对于简单的查询我们可以直接创建对应的接口方法就可以了。下面给出官网给出的例子:

interface PersonRepository extends Repository<Person, Long> {

  List<Person> findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname);

  // Enables the distinct flag for the query
  List<Person> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname);
  List<Person> findPeopleDistinctByLastnameOrFirstname(String lastname, String firstname);

  // Enabling ignoring case for an individual property
  List<Person> findByLastnameIgnoreCase(String lastname);
  // Enabling ignoring case for all suitable properties
  List<Person> findByLastnameAndFirstnameAllIgnoreCase(String lastname, String firstname);

  // Enabling static ORDER BY for a query
  List<Person> findByLastnameOrderByFirstnameAsc(String lastname);
  List<Person> findByLastnameOrderByFirstnameDesc(String lastname);
}

分页查询和排序,只需要在定义接口方法的时候给出Pageable以及Sort规则就可以了。

例子:

	@PostMapping("findPage")
    public void findPage(){
        Pageable page =  Pageable.ofSize(3).withPage(1);
        Iterable<Animal> all = animalRepostory.findAll(page);
        for(Iterator<Animal> iterator = all.iterator(); iterator.hasNext();System.out.println(iterator.next())){
        }
    }

    @PostMapping("findPageSort")
    public void findPageSort(){
        Sort sort = Sort.by("age").descending();
        Iterable<Animal> all = animalRepostory.findAll(sort);
        for(Iterator<Animal> iterator = all.iterator(); iterator.hasNext();System.out.println(iterator.next())){
        }
    }

自定义DSL查询:

这里用一个模糊查询举例:

在对应的接口创建一个接口,并在@Query注解里面写上对应的查询语句

public interface AnimalRepostory extends ElasticsearchRepository<Animal,Long> {
    @Query("{\n" +
            "    \"wildcard\": {\n" +
            "      \"name\": {\n" +
            "        \"value\": \"t*\"\n" +
            "      }\n" +
            "    }\n" +
            "  }")
    List<Animal> findTest();
}

效果:

    @PostMapping("findQuery")
    public void findQuery(){
        List<Animal> test = animalRepostory.findTest();
        test.forEach(ele->{
            System.out.println(ele);
        });
    }

Java 操作ElasticSearch

Spring Data还提供了很多其他的查询功能,如果有需要用到的我建议可以去看看官网。 文章来源地址https://www.toymoban.com/news/detail-464178.html

到了这里,关于Java 操作ElasticSearch的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【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日
    浏览(48)
  • ElasticSearch的客户端操作

    ElasticSearch的客户端操作 使用Kibana进行以下实验,进行Restful接口访问 索引库操作,完成对索引的增、删、查操作 “acknowledged” : true, 代表操作成功 “shards_acknowledged” : true, 代表分片操作成功 “index” : “shopping” 表示创建的索引库名称 注意:创建索引库的分片数默认5片,

    2024年02月12日
    浏览(51)
  • 袁庭新ES系列15节|Elasticsearch客户端基础操作

    上一章节我们介绍了搭建Elasticsearch集群相关的知识。那么又该如何来操作Elasticsearch集群呢?在ES官网中提供了各种语言的客户端,我们在项目开发过程中有多种Elasticsearch版本和连接客户端可以选择,那么他们有什么区别?这一章节袁老师带领大家来学习Elasticsearch客户端相关

    2024年04月25日
    浏览(48)
  • Elasticsearch Java客户端

    客户端 优点 缺点 说明 Java Low Level Rest Client 与ES版本之间没有关系,适用于作为所有版本ES的客户端 Java High Level Rest Client 使用最多 使用需与ES版本保持一致 基于Low Level Rest Client, 注意:7.15版本之后将被弃用 TransportClient 使用Transport 接口进行通信,能够使用ES集群中的一些特

    2024年02月15日
    浏览(30)
  • Elasticsearch Java客户端和Spring data elasticsearch-Elasticsearch文章三

    https://www.elastic.co/cn/ 整合springboot看上一篇文章 一定要对应好版本,Elasticsearch 的不同版本变化是真大, https://docs.spring.io/spring-data/elasticsearch/docs/4.4.10/reference/html/ Springboot: 2.7.10 spring-data-elasticsearch: 4.4.10 spring-boot-starter-data-elasticsearch: 2.7.10 elasticsearch-java: 7.17.9 https://github.com/

    2024年02月14日
    浏览(39)
  • 干货 | Elasticsearch Java 客户端演进历史和选型指南

    Elasticsearch 官方提供了很多版本的 Java 客户端,包含但不限于: Transport 客户端 Java REST 客户端 Low Level REST 客户端 High Level REST 客户端 Java API 客户端 非官方的 Java 客户端,包含但不限于: Jest 客户端 BBoss 客户端 Spring Data Elasticsearch 客户端 ...... 写出来的就接近十款客户端! El

    2023年04月11日
    浏览(48)
  • java 客户端操作HDFS

    部署包win版本 源码包zip包 lib整合:共121个jar包 $HADOOP_PREFIX/share/hadoop/{common,hdfs,mapreduce,yarn,tools}/{lib,.}*.jar  将windows版本hadoop/bin/hadoop.dll 放到c:/windows/system32下 hadoop的bin和sbin目录放PATH中+HADOOP_HOME+HADOOP_USER_NAME=root 安装插件 配置 重启电脑!!!!!!!加载hadoop.dll 创建java p

    2024年02月10日
    浏览(48)
  • Elasticsearch8.x版本Java客户端Elasticsearch Java API Client中常用API练习

    在Es7.15版本之后,es官方将它的高级客户端RestHighLevelClient标记为弃用状态。同时推出了全新的java API客户端Elasticsearch Java API Client,该客户端也将在Elasticsearch8.0及以后版本中成为官方推荐使用的客户端。 Elasticsearch Java API Client支持除Vector title search API和Find structure API之外的所有

    2024年04月11日
    浏览(46)
  • windows环境安装elasticsearch+kibana并完成JAVA客户端查询

    elasticsearch 官网下载比较慢,有时还打不开,可以通过https://elasticsearch.cn/download/下载,先找到对应的版本,最好使用迅雷下载,秒下的,我的下载速度可以达到40M/S 解压后点击 elasticsearch-7.10.0binelasticsearch.bat 运行成功后,输入http://120.0.0.1:9200,可以访问说明ES启动成功 点击

    2024年02月14日
    浏览(47)
  • HDFS之Java客户端操作

    Hadoop版本:Hadoop-3.1.3 Linux版本:CentOS7.5 IDE工具:IntelliJ IDEA(Windows环境下) HDFS的Java客户端操作也是入门Hadoop开发的学习重点 下载依赖 https://github.com/steveloughran/winutils 根据自己的Hadoop安装版本选择对应版本的依赖,如果需要更高版本的依赖,请从以下地址下载 https://github.

    2024年02月12日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包