springboot整合elasticsearch
springboot整合elasticsearch有以下几种方式:
- 使用官方的elasticsearch java客户端进行集成 
  
- 通过添加elasticsearch java客户端的依赖,可以直接在spring boot应用中使用原生的elasticsearch api进行操作。
 - 参考文档
 
 - 使用spring data elasticsearch进行集成 
  
- spring data elasticsearch是spring data项目的一部分,提供了更高级的抽象和易用性,可以简化与elasticsearch的交互。
 - 通过添加spring data elasticsearch的依赖,可以使用repository接口和注解来定义和执行crud操作。
 - 官方文档
 
 
本文使用第一种方式。使用官方推荐的resthighlevelclient操作es。由于版本兼容问题,请选择和elasticsearch对应的java客户端版本。
使用官方的elasticsearch java客户端进行集成
依赖

 从官方文档可以知道需要导入org.elasticsearch:elasticsearch和org.elasticsearch.client:elasticsearch-rest-client。
    <dependencies>
        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-starter-data-elasticsearch</artifactid>
            <version>2.2.2.release</version>
        </dependency>
        <dependency>
            <groupid>org.elasticsearch</groupid>
            <artifactid>elasticsearch</artifactid>
            <version>7.4.2</version>
        </dependency>
        <dependency>
            <groupid>org.elasticsearch.client</groupid>
            <artifactid>elasticsearch-rest-high-level-client</artifactid>
            <version>7.4.2</version>
        </dependency>
        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-starter-test</artifactid>
            <scope>test</scope>
        </dependency>
    </dependencies>
 
配置
@configuration
public class esconfig {
    /**
     * 解决netty引起的issue
     */
    @postconstruct
    void init() {
        system.setproperty("es.set.netty.runtime.available.processors", "false");
    }
    @bean
    public resthighlevelclient getrestclient() {
        resthighlevelclient resthighlevelclient = new resthighlevelclient(restclient
                .builder(new httphost("192.168.200.200", 9200, "http")));
        return resthighlevelclient;
    }
}
 
创建索引
    @autowired
    private resthighlevelclient resthighlevelclient;
    /**
     * 创建索引
     */
    @test
    public void createindex1() {
        string result = "创建成功";
        createindexrequest createindexrequest = new createindexrequest("stu");
        try {
            createindexresponse createindexresponse = resthighlevelclient.indices().create(createindexrequest, requestoptions.default);
            if (!createindexresponse.isacknowledged()){
                result = "创建失败";
            }else{
                result = "索引已经存在";
            }
        } catch (ioexception e) {
            e.printstacktrace();
            result = "接口异常";
        }
        system.out.println(result);
    }
 
   /**
     * 创建索引同时创建映射关系
     * 如索引存在:新增文档数据;如果索引不存在:创建一条索引
     */
    @test
    public void createindex2() {
        hashmap<string, object> map = new hashmap<>();
        map.put("user", "kimchyrw");
        map.put("postdate", new date());
        map.put("message", "trying out elasticsearch");
        indexrequest request = new indexrequest("posts")
                .id("2").source(map, xcontenttype.json);
        try {
            //响应信息
            indexresponse indexresponse = resthighlevelclient.index(request, requestoptions.default);
            string index = indexresponse.getindex();
            string id = indexresponse.getid();
            system.out.println("index: " + index + " id: " + id);
            //创建索引还是更新索引
            if (indexresponse.getresult() == docwriteresponse.result.created) {
                system.out.println("created.....");
            } else if (indexresponse.getresult() == docwriteresponse.result.updated) {
                system.out.println("updated....");
            }
            //校验分片信息
            replicationresponse.shardinfo shardinfo = indexresponse.getshardinfo();
            if (shardinfo.gettotal() != shardinfo.getsuccessful()){
            }
            if (shardinfo.getfailed() > 0) {
                for (replicationresponse.shardinfo.failure failure :shardinfo.getfailures()) {
                    string reason = failure.reason();
                    system.out.println("reason: " + reason);
                }
            }
        } catch (ioexception e) {
            e.printstacktrace();
        }
    }
 
更新文档中的数据
    /**
     * 更新一行数据
     */
    @test
    public void updatedoc() {
        //更新的数据
        hashmap<string, object> map = new hashmap<>();
        map.put("updated", new date());
        map.put("user", "kimchyrw");
        map.put("reason", "daily update");
        updaterequest updaterequest = new updaterequest("posts", "2")
                .doc(map);
        try {
            updateresponse updateresponse = resthighlevelclient.update(updaterequest, requestoptions.default);
            string index = updateresponse.getindex();
            string id = updateresponse.getid();
            long version = updateresponse.getversion();
            if (updateresponse.getresult() == docwriteresponse.result.created) {
                system.out.println("created");
            } else if (updateresponse.getresult() == docwriteresponse.result.updated) {
                system.out.println("updated");
            } else if (updateresponse.getresult() == docwriteresponse.result.deleted) {
                system.out.println("deleted");
            } else if (updateresponse.getresult() == docwriteresponse.result.noop) {
                system.out.println("noop");
            }
        } catch (ioexception e) {
            e.printstacktrace();
        }
    }
 
查询
   /**
     * 根据id查询document
     */
    @test
    public void getapi() {
        getrequest getrequest = new getrequest("posts", "1");
        //可选参数
        //禁用源检索,默认启用,开启后检索不到数据
       // getrequest.fetchsourcecontext(fetchsourcecontext.do_not_fetch_source);
        try {
            getresponse getresponse = resthighlevelclient.get(getrequest, requestoptions.default);
            string index = getresponse.getindex();
            string id = getresponse.getid();
            system.out.println("index: " + index + " id: " + id);
            if (getresponse.isexists()) {
                long version = getresponse.getversion();
                string sourceasstring = getresponse.getsourceasstring();
                map<string, object> sourceasmap = getresponse.getsourceasmap();
                byte[] sourceasbytes = getresponse.getsourceasbytes();
                system.out.println("version: " + version);
                system.out.println("sourceasmap: " + sourceasmap);
                system.out.println("sourceasbytes: " + arrays.tostring(sourceasbytes));
                system.out.println("sourceasstring: " + sourceasstring);
            }
        } catch (ioexception e) {
            e.printstacktrace();
        }
    }
 
   /**
     * 根据指定字段查询document
     */
    @test
    public void testsearch2() {
        searchrequest searchrequest = new searchrequest("posts");
        searchsourcebuilder searchsourcebuilder = new searchsourcebuilder();
        //根据指定字段查询
        searchsourcebuilder.query(querybuilders.termquery("user", "kimchy"));
        //分页查询记录
        searchsourcebuilder.from(0);
        searchsourcebuilder.size(5);
        //设置超时时间
       // searchsourcebuilder.timeout(new timevalue(60, timeunit.seconds));
        //按字段排序或者按评分排序
        searchsourcebuilder.sort(new scoresortbuilder().order(sortorder.desc));
        searchsourcebuilder.sort(new fieldsortbuilder("_id").order(sortorder.asc));
        //结果高亮
        //查询部分字段
        searchsourcebuilder.fetchsource(new string[]{"user"}, new string[]{"user1"});
        searchrequest.source(searchsourcebuilder);
        try {
            searchresponse searchresponse = resthighlevelclient.search(searchrequest, requestoptions.default);
            reststatus status = searchresponse.status();
            timevalue took = searchresponse.gettook();
            boolean terminatedearly = searchresponse.isterminatedearly();
            boolean timedout = searchresponse.istimedout();
            searchhits hits = searchresponse.gethits();
            totalhits totalhits = hits.gettotalhits();
            long numhits = totalhits.value;
            totalhits.relation relation = totalhits.relation;
            float maxscore = hits.getmaxscore();
            system.out.println("hits: " + hits + " totalhits: " + totalhits + " numhits: " + numhits + " maxscore: " + maxscore);
            searchhit[] searchhits = hits.gethits();
            for (searchhit hit: searchhits) {
                string id = hit.getid();
                system.out.println("id: " + id);
                string sourceasstring = hit.getsourceasstring();
                system.out.println(sourceasstring);
            }
        } catch (ioexception e) {
            e.printstacktrace();
        }
    }
 
使用spring data elasticsearch进行集成
依赖
        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-starter-data-elasticsearch</artifactid>
        </dependency>
        
        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-starter-data-jpa</artifactid>
        </dependency>
 
创建实体类
启动后会自动创建索引foodie-items
@data
@document(indexname = "foodie-items", createindex = true)
public class items {
    @javax.persistence.id
    private string id;
    @field(type = fieldtype.text)
    private string itemid;
    @field(type = fieldtype.text)
    private string itemname;
    @field(type = fieldtype.text)
    private string imgurl;
    @field(type = fieldtype.double)
    private integer price;
    @field(type = fieldtype.integer)
    private integer sellcounts;
    @field(type = fieldtype.integer)
    private integer catid;
    @field(type = fieldtype.integer)
    private integer rootcatid;
    @field(type = fieldtype.integer)
    private integer onoffstatus;
    @field(type = fieldtype.date, format = dateformat.basic_date_time)
    private date createdtime;
    @field(type = fieldtype.date, format = dateformat.basic_date_time)
    private date updatedtime;
    @field(type = fieldtype.text)
    private string content;
}
 
继承接口
继承elasticsearchrepository接口后,可以在接口中自定义方法,也可以使用接口提供的方法进行查询。和jpa的使用是类似的。
/**
 * 在实体类上使用注解,然后继承elasticsearchrepository接口, 启动后会自动创建索引
 */
@repository("esfooditemsrepository")
public interface esfooditemsrepository extends elasticsearchrepository<items, string> {
}
 
elasticsearch operations使用
    @autowired
    private elasticsearchoperations elasticsearchoperations;
    @test
    public void test2() {
        items items = elasticsearchoperations.get("1", items.class);
        system.out.println("items: " + items);
    }
 
 
            
                                            
                                            
发表评论