JAVA API操作ES
-
配置类
package jack.sun.config; import lombok.Data; import org.apache.http.HttpHost; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestHighLevelClient; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; //创建配置类 @Data @Configuration @ConfigurationProperties(prefix = "elasticsearch") public class ElasticSearchConfig { private String host; private Integer port; @Bean public RestHighLevelClient client(){ RestHighLevelClient restHighLevelClient = new RestHighLevelClient(RestClient.builder(new HttpHost(host,port,"http"))); return restHighLevelClient; } } application.properties elasticsearch.host=192.168.6.10 elasticsearch.port=9200
-
测试类
package jack.sun.config; import com.alibaba.fastjson.JSONObject; import jack.sun.pojo.Student; import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest; import org.elasticsearch.action.bulk.BulkItemResponse; import org.elasticsearch.action.bulk.BulkRequest; import org.elasticsearch.action.bulk.BulkResponse; import org.elasticsearch.action.delete.DeleteRequest; import org.elasticsearch.action.delete.DeleteResponse; import org.elasticsearch.action.get.GetRequest; import org.elasticsearch.action.get.GetResponse; import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.index.IndexResponse; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchRequestBuilder; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.support.master.AcknowledgedResponse; import org.elasticsearch.action.update.UpdateRequest; import org.elasticsearch.action.update.UpdateResponse; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.client.indices.CreateIndexRequest; import org.elasticsearch.client.indices.CreateIndexResponse; import org.elasticsearch.client.indices.GetIndexRequest; import org.elasticsearch.client.indices.GetIndexResponse; import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.aggregations.AggregationBuilder; import org.elasticsearch.search.aggregations.AggregationBuilders; import org.elasticsearch.search.aggregations.Aggregations; import org.elasticsearch.search.aggregations.bucket.terms.Terms; import org.elasticsearch.search.aggregations.metrics.Avg; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import java.io.IOException; @SpringBootTest @RunWith(SpringRunner.class) public class ElasticSearchTest { @Autowired private RestHighLevelClient client; @Test public void Test01(){ System.out.println("==============="); System.out.println(client); } String MYINDEX = "my_index"; //创建索引 @Test public void createIndex() throws Exception{ CreateIndexRequest request = new CreateIndexRequest(MYINDEX); request.mapping("{\n" + " \"properties\": {\n" + " \"name\": {\n" + " \"type\": \"keyword\",\n" + " \"index\": true,\n" + " \"store\": true\n" + " },\n" + " \"age\": {\n" + " \"type\": \"integer\",\n" + " \"index\": true,\n" + " \"store\": true\n" + " },\n" + " \"remark\": {\n" + " \"type\": \"text\",\n" + " \"index\": true,\n" + " \"store\": true,\n" + " \"analyzer\": \"ik_max_word\",\n" + " \"search_analyzer\": \"ik_smart\"\n" + " }\n" + " }\n" + " }", XContentType.JSON); CreateIndexResponse response = client.indices().create(request,RequestOptions.DEFAULT); System.out.println(response.isAcknowledged()); } //查看索引 @Test public void getIndex() throws Exception{ //设置请求索引 GetIndexRequest request = new GetIndexRequest(MYINDEX); //接收响应 GetIndexResponse response = client.indices().get(request,RequestOptions.DEFAULT); System.out.println(response.getMappings()); System.out.println(response.getSettings()); } //删除索引 @Test public void deleteIndex() throws Exception{ DeleteIndexRequest request = new DeleteIndexRequest(MYINDEX); AcknowledgedResponse response = client.indices().delete(request,RequestOptions.DEFAULT); System.out.println(response.isAcknowledged()); } //创建文档 @Test public void createIndex_doc() throws Exception{ IndexRequest indexRequest = new IndexRequest("test"); indexRequest.id("1"); Student student = new Student(18,"zhangsan","ewew"); indexRequest.source(JSONObject.toJSONString(student),XContentType.JSON); //创建响应流 IndexResponse indexResponse = client.index(indexRequest,RequestOptions.DEFAULT); System.out.println("创建了文档"); System.out.println(indexResponse.getIndex()); } //修改文档 @Test public void updateIndex() throws Exception{ UpdateRequest request = new UpdateRequest("test","1"); Student student = new Student(); student.setRemark("我是张三"); request.doc(JSONObject.toJSONString(student),XContentType.JSON); //创建响应流 UpdateResponse response = client.update(request,RequestOptions.DEFAULT); System.out.println(response.getResult()); } //删除文档 @Test public void deleteDocIndex() throws Exception{ DeleteRequest request = new DeleteRequest("test","1"); //创建响应对象 DeleteResponse response = client.delete(request,RequestOptions.DEFAULT); System.out.println(response.getResult()); } //根据Id进行查询 @Test public void getById() throws Exception{ GetRequest request = new GetRequest("test","1"); GetResponse response = client.get(request,RequestOptions.DEFAULT); System.out.println(response.getSourceAsString()); } //文档的批量操作 @Test public void bulk() throws Exception{ BulkRequest request = new BulkRequest(); Student student = new Student(); for(int i = 1; i<5 ;i++){ student.setAge(i); student.setName("张三"+i); student.setRemark("hello"+i); request.add(new IndexRequest("ttl").id(String.valueOf(1 + i)).source(JSONObject.toJSONString(student),XContentType.JSON)); } //迭代进行响应 BulkResponse response = client.bulk(request,RequestOptions.DEFAULT); for (BulkItemResponse bulkItemResponse : response) { System.out.println(bulkItemResponse.isFailed()); } } //查询文档 String DC_NAME = "my_index"; @Test public void DCQuery() throws IOException { SearchRequest request = new SearchRequest(DC_NAME); SearchSourceBuilder builder = new SearchSourceBuilder(); builder.query(QueryBuilders.matchQuery("title","华为")); request.source(builder); SearchResponse response = client.search(request,RequestOptions.DEFAULT); for (SearchHit hit : response.getHits()) { System.out.println(hit.getSourceAsString()); } } //文档的聚合查询 @Test public void aggsSearch(){ SearchRequest request = new SearchRequest(DC_NAME); SearchSourceBuilder builder = new SearchSourceBuilder(); builder.query(QueryBuilders.matchAllQuery()); AggregationBuilder aggregationBuilder = AggregationBuilders .terms("groupby_category").field("category"); aggregationBuilder.subAggregation(AggregationBuilders.avg("avg_price").field("price")); builder.aggregation(aggregationBuilder); request.source(builder); try { SearchResponse response = client.search(request, RequestOptions.DEFAULT); Aggregations aggregations = response.getAggregations(); Terms terms = aggregations.get("groupby_category"); terms.getBuckets().forEach(bucket -> { Avg avg = bucket.getAggregations().get("avg_price"); System.out.println(bucket.getKeyAsString() + ":" + bucket.getDocCount() + "," + avg.getValue()); }); } catch (IOException e) { e.printStackTrace(); } } }
Spirng Data框架
-
创建实体类
package jack.sun.elasticsearch.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.data.annotation.Id; import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Field; import org.springframework.data.elasticsearch.annotations.FieldType; @Data @Document(indexName = "product",shards = 1,replicas = 1) @AllArgsConstructor @NoArgsConstructor public class Product { @Id private int id; @Field(type = FieldType.Text,analyzer = "ik_smart") private String productName; @Field(type = FieldType.Integer) private int store; @Field(type = FieldType.Double,index = true,store = false) private double price; }
-
创建配置类
package jack.sun.elasticsearch.config; import lombok.Data; import org.apache.http.HttpHost; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClientBuilder; import org.elasticsearch.client.RestHighLevelClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration; @ConfigurationProperties(prefix = "elasticsearch") @Configuration @Data public class ElasticsearchConfig extends AbstractElasticsearchConfiguration { private String host ; private Integer port ; //重写父类方法 @Override public RestHighLevelClient elasticsearchClient() { RestClientBuilder builder = RestClient.builder(new HttpHost(host, port)); RestHighLevelClient restHighLevelClient = new RestHighLevelClient(builder); return restHighLevelClient; } } 配置文件 elasticsearch.host=192.168.6.10 elasticsearch.port=9200 logging.level.com.atguigu=debug
-
创建持久类
package jack.sun.elasticsearch.dao; import jack.sun.elasticsearch.pojo.Product; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; import org.springframework.stereotype.Repository; import java.util.List; @Repository public interface ProductDao extends ElasticsearchRepository<Product,Long> { List<Product> findByPriceBetween(double low, double high); }
-
创建测试类
package jack.sun.elasticsearch.test; import jack.sun.elasticsearch.dao.ProductDao; import jack.sun.elasticsearch.pojo.Product; import org.elasticsearch.client.RestHighLevelClient; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.domain.Sort; import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate; import org.springframework.test.context.junit4.SpringRunner; import java.util.List; @SpringBootTest @RunWith(SpringRunner.class) public class TestE { @Autowired private ElasticsearchRestTemplate elasticsearchRestTemplate; @Autowired private ProductDao productDao; @Test public void test01(){ //加载springBoot,加载配置类 //创建索引 根据product类中的@Document //elasticsearchRestTemplate.setIndex(product.class) //创建映射 根据Product类中的@Id @Field字段进行自动映射 //elasticsearchRestTemplate.putMapping(Product.class) } //添加文档 @Test public void add(){ Product product = new Product(2,"vivo手机",1000,5588); productDao.save(product); System.out.println("添加成功"); } //根据id进行查询 @Test public void findById(){ Product product = productDao.findById(1L).get(); System.out.println("product = " + product); } //查询所有信息 @Test public void findAll(){ Iterable<Product> products = productDao.findAll(Sort.by(Sort.Direction.DESC, "price")); for (Product product : products) { System.out.println("product = " + product); } } //自定义方法 @Test public void findBetweenPrice(){ List<Product> list = this.productDao.findByPriceBetween(7000,9000); for (Product product : list) { System.out.println("product = " + product); } } }