pom.xml

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

实体类

package com.mlwy.elastic.pojo;

public class Product {

    private String id;

    private String name;

    private String price;

    private String detail;

    public Product(){}
    public Product(String id, String name, String price, String detail){
        this.id = id;
        this.detail = detail;
        this.name = name;
        this.price = price;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPrice() {
        return price;
    }

    public void setPrice(String price) {
        this.price = price;
    }

    public String getDetail() {
        return detail;
    }

    public void setDetail(String detail) {
        this.detail = detail;
    }
}

结果集

package com.mlwy.elastic.pojo;

import java.util.Map;

public class Message {

    public String name;
    public Object msg;

    Message(){}
    public Message(String name, Object msg){
        this.msg = msg;
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


    public Object getMsg() {
        return msg;
    }

    public void setMsg(Object msg) {
        this.msg = msg;
    }
}

elasticsearch工具类

package com.mlwy.elastic.util;

import com.mlwy.elastic.pojo.Product;
import org.apache.http.HttpHost;
import org.elasticsearch.ElasticsearchStatusException;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.admin.indices.open.OpenIndexRequest;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.unit.Fuzziness;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.ScoreSortBuilder;
import org.elasticsearch.search.sort.SortOrder;

import java.io.IOException;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

/**
 * es搜索工具类
 * @author chenchbj
 */
public class ElasticUtils {

    // 相当于数据库名称(数据量小)
    public static String indexName = "mlwybj";

    // 初始化api客户端
    public static RestHighLevelClient client = new RestHighLevelClient(
            RestClient.builder(
                    new HttpHost("10.4.0.43", 9200, "http")
            ));

    // 关键字搜索 指定匹配类型
    public static List<Map<String, Object>> search(String type, String fieldName, String keyword, int start, int count) throws IOException {


        SearchRequest searchRequest = new SearchRequest(indexName);

        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        //关键字匹配对应字段
        MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder(fieldName, keyword);
        //模糊匹配
        matchQueryBuilder.fuzziness(Fuzziness.AUTO);
        sourceBuilder.query(matchQueryBuilder);
        //第几页
        sourceBuilder.from(start);
        //第几条
        sourceBuilder.size(count);

        searchRequest.source(sourceBuilder);
        searchRequest.types(type);
        //匹配度从高到低
        sourceBuilder.sort(new ScoreSortBuilder().order(SortOrder.DESC));

        SearchResponse searchResponse = client.search(searchRequest);

        SearchHits hits = searchResponse.getHits();

        List<Map<String, Object>> matchRsult = new LinkedList<Map<String, Object>>();

        for (SearchHit hit : hits.getHits())
        {
            matchRsult.add(hit.getSourceAsMap());
        }
        return matchRsult;
    }
    //删除指定类型
    public static void deleteDocument(Object object) throws IOException {
        if(object instanceof Product){
            DeleteRequest deleteRequest = new DeleteRequest (indexName,"product", ((Product) object).getId());
            System.out.println("已经从ElasticSearch服务器上删除id="+((Product) object).getId()+"的product文档");
            client.delete(deleteRequest);
        }
    }
    // 获得指定type指定id的数据 json
    public static Map getDocument(String type,String id) throws IOException {
        // TODO Auto-generated method stub
        GetRequest request = new GetRequest(
                indexName,
                type,
                id);

        GetResponse response = client.get(request);

        if(!response.isExists()){
            System.out.println("检查到服务器上 "+type+" id="+id+ "的文档不存在");
            return null;
        }
        else{
            String source = response.getSourceAsString();
            System.out.print("获取到服务器上 "+type+" id="+id+ "的文档内容是:");
            System.out.println(source);
            return response.getSourceAsMap();
        }
    }
    // 插入指定type,数据
    public static void addDocument(Object object) throws IOException {
        Map<String, Object> jsonMap = new HashMap<>();
        if(object instanceof Product){
            jsonMap.put("id", ((Product)object).getId());
            jsonMap.put("name", ((Product)object).getName());
            jsonMap.put("price", ((Product)object).getPrice());
            jsonMap.put("detail", ((Product)object).getDetail());
            IndexRequest indexRequest = new IndexRequest(indexName, "product", ((Product)object).getId())
                    .source(jsonMap);
            client.index(indexRequest);
            System.out.println("已经向ElasticSearch服务器增加Product:"+object);
        }

    }
    // 更新数据
    public static void updateDocument(Object object) throws IOException {

        if(object instanceof Product){
            UpdateRequest updateRequest = new UpdateRequest (indexName, "product", ((Product) object).getId())
                    .doc("name",((Product) object).getId())
                    .doc("price",((Product) object).getPrice())
                    .doc("detail",((Product) object).getDetail());
            client.update(updateRequest);
            System.out.println("已经在ElasticSearch服务器修改产品为:"+object);
        }


    }
    private static boolean checkExistIndex(String indexName) throws IOException {
        boolean result =true;
        try {

            OpenIndexRequest openIndexRequest = new OpenIndexRequest(indexName);
            client.indices().open(openIndexRequest).isAcknowledged();

        } catch (ElasticsearchStatusException ex) {
            String m = "Elasticsearch exception [type=index_not_found_exception, reason=no such index]";
            if (m.equals(ex.getMessage())) {
                result = false;
            }
        }
        if(result){
            System.out.println("索引:" +indexName + " 是存在的");
        }else{
            System.out.println("索引:" +indexName + " 不存在");
        }


        return result;

    }

    private static void deleteIndex(String indexName) throws IOException {
        DeleteIndexRequest request = new DeleteIndexRequest(indexName);
        client.indices().delete(request);
        System.out.println("删除了索引:"+indexName);

    }

    private static void createIndex(String indexName) throws IOException {
        // TODO Auto-generated method stub
        CreateIndexRequest request = new CreateIndexRequest(indexName);
        client.indices().create(request);
        System.out.println("创建了索引:"+indexName);
    }

   
    public static String getIndexName() {
        return indexName;
    }

    public static void setIndexName(String indexName) {
        ElasticUtils.indexName = indexName;
    }

    public static RestHighLevelClient getClient() {
        return client;
    }

    public static void setClient(RestHighLevelClient client) {
        ElasticUtils.client = client;
    }

}

service

package com.mlwy.service.elastic;

import com.mlwy.elastic.pojo.Message;
import com.mlwy.elastic.pojo.Product;

public interface ElasticService {

    Message addProduct(Product product);

    Message delProduct(String id);

    Message getProduct(String id);

    Message searchProduct(String fieldName, String keyword, int start, int count);

    Message updateProduct(Product product);
}

package com.mlwy.service.elastic.impl;

import com.mlwy.elastic.pojo.Message;
import com.mlwy.elastic.pojo.Product;
import com.mlwy.elastic.util.ElasticUtils;
import com.mlwy.service.elastic.ElasticService;
import org.springframework.stereotype.Service;

import java.io.IOException;

/**
 * @author chenchbj
 */
@Service
public class ElasticServiceImpl implements ElasticService {


    @Override
    public Message addProduct(Product product) {
        try {
            ElasticUtils.addDocument(product);
        } catch (IOException e) {
            e.printStackTrace();
            return new Message("500",null);
        }
        return new Message("200",null);
    }

    @Override
    public Message delProduct(String id) {
        Product product = new Product();
        product.setId(id);
        try {
            ElasticUtils.deleteDocument(product);
        } catch (IOException e) {
            e.printStackTrace();
            return new Message("500",null);
        }
        return new Message("200",null);
    }

    @Override
    public Message getProduct(String id)  {
        try {
            return new Message("200",ElasticUtils.getDocument("product",id));
        } catch (IOException e) {
            e.printStackTrace();
            return new Message("500",null);
        }
    }

    @Override
    public Message searchProduct(String fieldName,String keyword,int start,int count) {
        try {
            return new Message("200",ElasticUtils.search("product",fieldName,keyword,start,count));
        } catch (IOException e) {
            e.printStackTrace();
            return new Message("500",null);
        }
    }

    @Override
    public Message updateProduct(Product product) {
        try {
            ElasticUtils.updateDocument(product);
        } catch (IOException e) {
            e.printStackTrace();
            return new Message("500",null);
        }
        return new Message("200",null);
    }
}

controller

package com.mlwy.controller.elastic;

import com.mlwy.elastic.pojo.Message;
import com.mlwy.elastic.pojo.Product;
import com.mlwy.service.elastic.ElasticService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * elasticsearch搜索
 * 20210508
 * @author chenchbj
 */
@Controller
@RequestMapping("/es")
public class ElasticController {

    @Autowired
    private ElasticService elasticService;

    /**
    * http://10.4.0.93:8081/mlwybj/es/addDetail.html?id=3&name=%E4%B8%80%E5%8A%A0%E6%89%8B%E6%9C%BA&price=6799&detail=%E4%B8%80%E5%8A%A0%E6%89%8B%E6%9C%BA%E5%A5%BD%E7%9C%8B%EF%BC%8Cqingos%E7%B3%BB%E7%BB%9F%E5%A5%BD
    * 添加
    */
    @RequestMapping("/addDetail")
    @ResponseBody
    public Message addProduct(Product vo){
        return elasticService.addProduct(vo);
    }

    @RequestMapping(value = "delProduct")
    @ResponseBody
    public Message delProduct(
            @RequestParam(name = "id")String id){
        return elasticService.delProduct(id);
    }

    @RequestMapping(value = "updateProduct",method = RequestMethod.PUT)
    @ResponseBody
    public Message updateProduct(
            @RequestParam(name = "id")String id,
            @RequestParam(name = "name")String name,
            @RequestParam(name = "price")String price,
            @RequestParam(name = "detail")String detail){
        return elasticService.updateProduct(new Product(id,name,price,detail));
    }

    /**
     * http://10.4.0.93:8081/mlwybj/es/searchProduct.html?fieldName=name&name=%E6%89%8B%E6%9C%BA&start=0&count=10
     * @param fieldName 查询类型 比如 name detail price
     * @param name 关键字
     * @param start 开始
     * @param count
     * @param id 可以不传
     * http://10.4.0.93:8081/mlwybj/es/searchProduct.html?fieldName=name&name=%E6%89%8B%E6%9C%BA&start=0&count=4&id=3
     *
     *http://10.4.0.93:8081/mlwybj/es/searchProduct.html?fieldName=detail&name=%E7%BD%97%E6%B0%B8%E6%B5%A9&start=0&count=10
http://10.4.0.93:8081/mlwybj/es/searchProduct.html?fieldName=price&name=4799&start=0&count=10 
     * @return
     */
    @RequestMapping(value = "searchProduct",method = RequestMethod.GET)
    @ResponseBody
    public Message searchProduct(
            @RequestParam(name = "fieldName",required = false)String fieldName,
            @RequestParam(name = "name",required = false)String name,
            @RequestParam(name = "start",required = false)Integer start,
            @RequestParam(name = "count",required = false)Integer count,
            @RequestParam(name = "id",required = false)String id){
        if(id != null){
            return elasticService.getProduct(id);
        }else {
            return elasticService.searchProduct(fieldName,name,start,count);
        }
    }

}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最后一个图是查看elasticsearch是否启动成功。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐