spring boot整合Elasticsearch使用Jest客户端方式,实现查询结果分页

初学Elasticsearch,如果有错误的地方,感谢各位大牛帮我指出~谢谢


首先新建一个maven工程,在pom中引入依赖

     
        org.springframework.boot
        spring-boot-starter-web
      

      
        org.springframework.boot
        spring-boot-starter-data-elasticsearch
      

    
        com.alibaba
        fastjson
        1.2.11
    

    
        com.sun.jna
        jna
        3.0.9
   

   
        io.searchbox
        jest
    

    
        com.baomidou
        mybatisplus-spring-boot-starter
        1.0.4
    

    
        com.baomidou
        mybatis-plus
        2.1.8
    

    
        org.springframework.boot
        spring-boot-starter-freemarker
    

    
        org.mybatis.spring.boot
        mybatis-spring-boot-starter
        1.1.1
    

 然后在application.properties文件中设置各种配置信息

spring.mvc.static-path-pattern=/static/**

 设置静态资源的位置

注:网上查资料说,这里spring boot应该自动映射到resources下去查找资源,但是我的工程中貌似无法加载js,css,所以只有自己指定静态资源的路径,静态资源加载问题解决!

spring.elasticsearch.jest.uris=http://192.168.152.129:9200
spring.elasticsearch.jest.read-timeout=5200

jest客户端连接设置

注意:这里jest客户端使用9200端口,是es默认的http形式管理端口

spring.freemarker.suffix=.html
spring.freemarker.templateEncoding=UTF-8
spring.freemarker.templateLoaderPath=classpath:/templates/

FreeMarker设置

然后是Controller类

@Controller
@RequestMapping("/bank")
public class BankController {
    
    @Autowired
    private BankService bankService;
   
    @RequestMapping("/index")
    public String index(HttpServletRequest request){
        request.setAttribute("base", request.getContextPath());
        return "bank/index";
    }
    
    @RequestMapping("/query")
    public void query(HttpServletRequest request,HttpServletResponse response){
        int draw = Integer.valueOf(request.getParameter("draw"));
        int start = Integer.valueOf(request.getParameter("start"));
        int length = Integer.valueOf(request.getParameter("length"));
        int page = (start+length)/length;
        
        Page pageObj = new Page(page,length);
        Page pager = bankService.queryAll(pageObj);
        this.renderJson(response, this.toDataTable(pager, draw).toString());
    }
   
    @SuppressWarnings("rawtypes")
    public com.alibaba.fastjson.JSONObject toDataTable(Page page,int draw){
        com.alibaba.fastjson.JSONObject jsonObject = new com.alibaba.fastjson.JSONObject();
        jsonObject.put("draw", draw);
        jsonObject.put("recordsTotal", Long.valueOf(page.getTotal()));
        jsonObject.put("recordsFiltered", Long.valueOf(page.getTotal()));
        List list = page.getRecords();
        com.alibaba.fastjson.JSONArray jsonarray = (JSONArray)JSONArray.toJSON(list);
        jsonObject.put("data", jsonarray);
        return jsonObject;
    }
    
    public void renderJson(HttpServletResponse response, String text) {
        response.setContentType("application/json;charset=UTF-8");
        response.setHeader("Pragma", "No-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);
        try {
            response.getWriter().write(text);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Service类

public interface BankService {
    public Page queryAll(Page pageObj);
}

ServiceImpl

@Service
public class BankServiceImpl implements BankService {
    
    @Autowired
    private BankDao bankDao;
    
    public Page queryAll(Page pageObj){
        Page page = new Page();
        String sort = "account_number";
        SearchResult result = bankDao.queryAll(pageObj, Customer.INDEX_NAME, Customer.TYPE_NAME,sort);
        List> list = result.getHits(Customer.class);
        List lc = new ArrayList();
        for(int i=0;i             lc.add(list.get(i).source);
        }
        page.setTotal(result.getTotal());
        page.setRecords(lc);
        
        return page;
    }
}

 Dao类

public interface BankDao {
    public SearchResult queryAll(Page pageObj,String index,String type,String sort);
}

DaoImpl类

@Service
public class BankDaoImpl implements BankDao {
    
    @Autowired
    private JestClient jestClient;
    
    SearchResult result;
    public SearchResult queryAll(Page pageObj,String index,String type,String sort){
        try{
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            searchSourceBuilder.query(QueryBuilders.matchAllQuery());
            searchSourceBuilder.from((pageObj.getCurrent()-1)*pageObj.getSize());
            searchSourceBuilder.size(pageObj.getSize());
            searchSourceBuilder.sort(sort);
            Search search = new Search.Builder(searchSourceBuilder.toString())
                        .addIndex(index).addType(type).build();
            result=jestClient.execute(search);
        }catch(Exception e){
            System.out.println(e.getMessage());
        }
        return result;
    }
}

Custonmer类

public class Customer {
    public static final String INDEX_NAME = "bank";
    public static final String TYPE_NAME = "account";
    public int account_number;
    public long balance;
    public String firstname;
    public String lastname;
    public long age;
    public String gender;
    public String address;
    public String employer;
    public String email;
    public String city;
    public String state;
    @JestId
    public String id;
}

各属性的get和set方法在这里就省略了

 

前台使用Jquery的Datatable框架


    
        用户管理
        
        
        
        
    
    
    
    


               

                   
            
        
        

   
    
    
    
    
    
    

bootstrap和datatable的js和css网上可以下载到

然后是自定义的bank.js

$(function(){
    //加载表格数据
    var grid = new Datatable();
    grid.init({
        src: $("#list-table"),
        onSuccess: function(grid) {},
        onError: function(grid) {},
        dataTable: {
            "columns": [{
                "data": "account_number",
                "sClass":"text-center",
                "bSortable": false,
                "sWidth":"100px"
            },{
                "data": "firstname",
                "sClass":"text-center",
                "bSortable": false
            },{
                "data": "lastname",
                "sClass":"text-center",
                "bSortable": false
            },{
                "data": "age",
                "sClass":"text-center",
                "bSortable": false,
                "sWidth":"150px"
            },{
                "data": "balance",
                "bSortable": false,
                "sClass":"text-center"
            },{
                "data": "gender",
                "bSortable": false,
                "sClass":"text-center"
            },{
                "data": "state",
                "sClass":"text-center",
                "bSortable": false
            }
        ],
            "columnDefs": [{
                "targets": [0],
                "render": function(data,type,full){
                    return ""+data+"";
                }
           },
           {
                    "targets": [1],
                    "render": function(data, type, full) {
                        return ""+data+"";
                    }

            },
            {
                    "targets": [2],
                    "render": function(data, type, full) {
                        return ""+data+"";
                    }

            },
            {
                 "targets": [3],
                        "render": function(data, type, full) {
                            return ""+data+"";
                  }
            },
            {
                 "targets": [4],
                        "render": function(data, type, full) {
                            return ""+data+"";
                  }
            },
            {
                 "targets": [5],
                        "render": function(data, type, full) {
                            return ""+data+"";
                  }
            },
            {
                 "targets": [6],
                        "render": function(data, type, full) {
                            return ""+data+"";
                  }
            }
        ],
            "bProcessing":  true,
            "pageLength": 10,
            "ajax": {
                "url": getRootPath() + '/bank/query',
                'data' : function (d) {
                    d.name=$('#name').val();
                  }
            }
        }
    });
)

代码基本结束了,输入地址 localhost:8080/bank/index 访问

spring boot整合Elasticsearch使用Jest客户端方式,实现查询结果分页_第1张图片

我提前从网上下载了一些资源导入到自己导elasticsearch中

你可以从这里下载一些资源(account.json)到当前目录下,然后使用如下的命令把它加载到自己的集群中:

curl -H "Content-Type: application/json" -XPOST 'localhost:9200/bank/account/_bulk?pretty&refresh' --data-binary "@accounts.json"
curl 'localhost:9200/_cat/indices?v'

 返回结果为:

health status index uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   bank  l7sSYV2cQXmu6_4rJWVIww   5   1       1000            0    128.6kb        128.6kb

 说明导入成功。

参考:https://blog.csdn.net/hololens/article/details/78932628

 

这里通过在SearchSourceBuilder设置form和size实现分页(Elasticsearch默认查询显示是10条)

在查资料的过程中发现,看到有使用Sliced和Scroll滚动id方式进行分页查询的,不过奈何本人初学es,没看明白,所以暂且用这种方式吧就

如有错误,敬请指出,谢谢~

你可能感兴趣的:(spring boot整合Elasticsearch使用Jest客户端方式,实现查询结果分页)