java使用elasticsearch进行模糊查询之must使用

java使用elasticsearch进行多个条件模糊查询

文章说明:

1、本篇文章,本人会从java连接elasticsearch到查询结果生成并映射到具体实体类(涵盖分页功能)

2、代码背景:elasticsearch版本为:5.2.0;

3、本人以下代码是分别从两个索引中查询数据,再将两个数据进行整合,如果大家只需要分组查询,那么则选取文章中的分组查询部分代码

4、本人的实体类主要是按照layUI分页框架进行设计;实体大家可以根据自己的具体需求进行设计

一、java连接elasticsearch工具类

public class ESClientConnectionUtil {
    public static TransportClient client=null;
    public final static String HOST = "192.168.200.200"; //服务器部署ip 根据自己ip进行更改
    public final static Integer PORT = 9301; //端口

    public static TransportClient  getESClient(){
        System.setProperty("es.set.netty.runtime.available.processors", "false");
        if (client == null) {
            synchronized (ESClientConnectionUtil.class) {
                try {
                    //设置集群名称
                    Settings settings = Settings.builder().put("cluster.name", "es5").put("client.transport.sniff", true).build();
                    //创建client
                    client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(HOST), PORT));
                } catch (Exception ex) {
                    ex.printStackTrace();

                    System.out.println(ex.getMessage());
                }
            }
        }
        return client;
    }
    public static TransportClient  getESClientConnection(){
        if (client == null) {
            System.setProperty("es.set.netty.runtime.available.processors", "false");
                try {
                    //设置集群名称
                    Settings settings = Settings.builder().put("cluster.name", "es5").put("client.transport.sniff", true).build();
                    //创建client
                    client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(HOST), PORT));
                } catch (Exception ex) {
                    ex.printStackTrace();
                    System.out.println(ex.getMessage());
            }
        }
        return client;
    }
    //判断索引是否存在
    public static boolean judgeIndex(String index){
        client= getESClientConnection();
         IndicesAdminClient adminClient;
        //查询索引是否存在
        adminClient= client.admin().indices();
        IndicesExistsRequest request = new IndicesExistsRequest(index);
        IndicesExistsResponse responses = adminClient.exists(request).actionGet();

        if (responses.isExists()) {
            return true;
        }
        return false;
    }
}

二、实体类

(一)分页实体总类

public class KnowledgeTopicListDTO {
   private Long totalCount;//总条数
   private Integer page;//页数
   private Integer limit;//每页查询条数
   private List<KnowledgeTopicDTO> topicDTOList;//每页显示数据的对象集合

    public Long getTotalCount() {
        return totalCount;
    }

    public void setTotalCount(Long totalCount) {
        this.totalCount = totalCount;
    }

    public Integer getPage() {
        return page;
    }

    public void setPage(Integer page) {
        this.page = page;
    }

    public Integer getLimit() {
        return limit;
    }

    public void setLimit(Integer limit) {
        this.limit = limit;
    }

    public List<KnowledgeTopicDTO> getTopicDTOList() {
        return topicDTOList;
    }

    public void setTopicDTOList(List<KnowledgeTopicDTO> topicDTOList) {
        this.topicDTOList = topicDTOList;
    }
}

(二)页面显示数据对象实体

public class KnowledgeTopicDTO {
    private Long id;//知识主题id
    private String name;//知识主题名称
    private Boolean active;//有效无效 true,false
    private String activeString;//有效无效
    private Boolean noSubscription;//是否需要订阅 true,false
    private String noSubscriptionString;//是否需要订阅
    private Long quantity;//数据量
    private String _id;
    private String ids;

    public String getIds() {
        return ids;
    }

    public void setIds(String ids) {
        this.ids = ids;
    }

    public Long getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public Boolean getActive() {
        return active;
    }

    public void setActive(Boolean active) {
        this.active = active;
    }

    public String getActiveString() {
        return activeString;
    }

    public void setActiveString(String activeString) {
        this.activeString = activeString;
    }

    public Boolean getNoSubscription() {
        return noSubscription;
    }

    public void setNoSubscription(Boolean noSubscription) {
        this.noSubscription = noSubscription;
    }

    public String getNoSubscriptionString() {
        return noSubscriptionString;
    }

    public void setNoSubscriptionString(String noSubscriptionString) {
        this.noSubscriptionString = noSubscriptionString;
    }

    public Long getQuantity() {
        return quantity;
    }

    public void setQuantity(Long quantity) {
        this.quantity = quantity;
    }

    public String get_id() {
        return _id;
    }

    public void set_id(String _id) {
        this._id = _id;
    }
}

三、后台service层代码

 public KnowledgeTopicListDTO selectTopicByName(String name, Integer page, Integer limit) {
        SearchResponse searchResponse=null;
        Map<String,Object> map = new HashMap<>();
        TransportClient transportClient =  ESClientConnectionUtil.getESClientConnection();
            SearchRequestBuilder requestBuilder = client.prepareSearch("knowledge").setTypes("knowledge_theme");
            // 声明where条件
            BoolQueryBuilder qbs = QueryBuilders.boolQuery();
            /**此处使用模糊匹配查询 类比数据库中 like*/
            QueryBuilder qb1 = QueryBuilders.matchPhraseQuery("name", name);
            BoolQueryBuilder bqb1 = QueryBuilders.boolQuery().must(qb1);
            qbs.must(bqb1);
            requestBuilder.setQuery(qbs);
            int num=limit*(page-1);
            SearchResponse response = requestBuilder.setFrom(0).setSize(10).execute().actionGet();
            //获取总条数
//        long totalCount = searchResponse.getHits().getTotalHits();
            List<KnowledgeTopicDTO> list = new ArrayList<KnowledgeTopicDTO>();
            for (SearchHit hit : response.getHits().getHits()) {
                //获取到当前页的数据
                JSONObject obj = new JSONObject().fromObject(hit.getSourceAsString());//将json字符串转换为json对象
                KnowledgeTopicDTO topic = (KnowledgeTopicDTO) JSONObject.toBean(obj, KnowledgeTopicDTO.class);//将建json对象转换为Person对象
                list.add(topic);
            }
            //查询主题总数
        Terms terms= ESGroupByUtil.GroupByOne(client,"hottopic","hot","sum","tasktitleid");
        list= groupList(list,terms);//调用组合主题总数方法
        KnowledgeTopicListDTO knowledgeTopicListDTO = new KnowledgeTopicListDTO();
        knowledgeTopicListDTO.setLimit(limit);
        knowledgeTopicListDTO.setPage(page);
        knowledgeTopicListDTO.setTopicDTOList(list);
        return knowledgeTopicListDTO;
    }

五、根据单个字段分组查询

public class ESGroupByUtil {

    /**
     *@description: 根据单个字段分组求和
     *@author:cyb
     *@date: 2018-11-16 17:31
    *@param: client ES连接
    *@param: indices 索引
    *@param: types 类型
    *@param: alias 分组求和别名
    *@param: DomName 分组目标字段名
     *@return: org.elasticsearch.search.aggregations.bucket.terms.Terms
     */
    public static Terms GroupByOne(TransportClient client,String indices,String types,String alias,String DomName){
        SearchRequestBuilder sbuilder = client.prepareSearch(indices).setTypes(types);
        TermsAggregationBuilder termsBuilder = AggregationBuilders.terms(alias).field(DomName);
        sbuilder.addAggregation(termsBuilder);
        SearchResponse responses= sbuilder.execute().actionGet();
        Terms terms = responses.getAggregations().get(alias);
        return terms;
    }

}

六 、将分组查询的数据进行整合到已查询到的集合中

 /**
     *@description:将查询的总数合并到list中
     *@author:cyb
     *@date: 2018-11-16 17:51
    *@param: list
    *@param: terms
     *@return: java.util.List<com.yjlc.platform.bsKnowledge.KnowledgeTopicDTO>
     */
      public List<KnowledgeTopicDTO> groupList(List<KnowledgeTopicDTO> list,Terms terms){
        List<BsKnowledgeInfoDTO> lists = new ArrayList<>();
        for(int i=0;i<terms.getBuckets().size();i++){
            //statistics
            String id =terms.getBuckets().get(i).getKey().toString();//id
            Long sum =terms.getBuckets().get(i).getDocCount();//数量
            BsKnowledgeInfoDTO bsKnowledgeInfoDTO1 = new BsKnowledgeInfoDTO();
            bsKnowledgeInfoDTO1.setId(id);
            bsKnowledgeInfoDTO1.setSum(sum);
            lists.add(bsKnowledgeInfoDTO1);
            System.out.println("=="+ terms.getBuckets().get(i).getDocCount()+"------"+terms.getBuckets().get(i).getKey());
        }
        for(int i=0;i<lists.size();i++){
            for(int j=0;j<list.size();j++){
                if(lists.get(i).getId().equals(list.get(j).getId())){
                    list.get(j).setQuantity(lists.get(i).getSum());
                }
            }
        }

        return list;
    }

总结:以上代码是本人的亲自测试通过的,分页后期建议大家不用使用from,size格式,当数据量超过1w的时候,速度会越来越慢,并可能造成宕机。

原文地址:https://www.cnblogs.com/chenyuanbo/p/9973452.html

时间: 2024-10-15 14:38:49

java使用elasticsearch进行模糊查询之must使用的相关文章

java使用elasticsearch进行模糊查询

使用环境上篇文章本人已书写过,需要maven坐标,ES连接工具类的请看上一篇文章,以下是内容是笔者在真实项目中运用总结而产生,并写的是主要方法和思路,具体实现大家可以看后面文章,若其中有不适,请大家多多包涵 一.ES模糊查询 (一)不含中文模糊查询,适用于数字 SearchResponse searchResponse=null; //连接elasticsearch TransportClient transportClient = ESClientConnectionUtil.getESCli

如何在java List中进行模糊查询

比如我有下面这样一个List,里面存放的是多个Employee对象.然后我想对这个List进行按照Employee对象的名字进行模糊查询.有什么好的解决方案么?比如我输入的查询条件为“wang”,那么应该返回只包含employee1的List列表. List list = new ArrayList(); Employee employee1 = new Employee(); employee1.setName("wangqiang"); employee1.setAge(30);

java使用elasticsearch分组进行聚合查询(group by)

java连接elasticsearch 进行聚合查询进行相应操作 一:对单个字段进行分组求和 1.表结构图片: 根据任务id分组,分别统计出每个任务id下有多少个文字标题 1.SQL:select id, count(*) as sum from task group by taskid;   java ES连接工具类 public class ESClientConnectionUtil { public static TransportClient client=null; public f

java连接数据库的模糊查询

1:模糊查询是比较常见的一种查询方式,例如在订单表中,包含有订单的具体日期.如果要查询某年某月的订单信息,最好的方式就是使用模糊查询.进行模糊查询需要使用关键字LIKE.在使用LIKE关键字进行模糊查询时,可以使用通配符"%",来代替0个或者多个字符,使用下划线_来代表一个字符. 注释:需要注意的是在使用LIKE的时候,后面的查询条件需要加 '  ',英文状态下的单引号引起来,不然报错如下 You have an error in your SQL syntax; check the

[原创]java WEB学习笔记23:MVC案例完整实践(part 4)---模糊查询的设计与实现

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------

模糊查询内存查询java实现

下面说说看到的工作项目中的代码,是这个样子的,事先查询一次数据库,将查询到的整张表的数据存到内存,以后使用时不再查询数据库,而直接操作内存中的数据,这主要用于数据库中的数据比较稳定,不会轻易改变的情况,比如法律条款,医疗术语,拿到这些数据主要是用于模糊查询,我对相关代码进行了改动,把原来固定的通过某些字段的模糊查询改为可选择通过哪些字段进行模糊查询,下面看一下代码 控制层,服务层没什么可说的,直接看代码 package study.fuzzysearch.controller; import j

java页面模糊查询

car项目模糊查询,不需要去修改list.js,只需要修改list.html中的这行修改代码即可!s //查询0919模糊,这一块$('#btnquery').click(function(){        f_hgrid_ini();        //通过下面这行代码去取值    var carId=document.getElementById("carId").value    alert(carId);        alert("999999");  

转:使用Mongo Connector和Elasticsearch实现模糊匹配

原文来自于:http://www.csdn.net/article/2014-09-01/2821485-how-to-perform-fuzzy-matching-with-mongo-connector 摘要:短短两年,Mongo Connector取得了突破性的进展,用户已经可以通过它完成连接器两边的同步更新.而基于这个特性,其他工具针对MongoDB内存储文件的实时操作也成为可能. [编者按]本篇博文作者Luke Lovett是MongoDB公司的Java工程师,他展示了Mongo Co

如何结合IbatisNet的LIST遍历实现模糊查询

我仿照Java的Spring+Ibatis+Struct用Castle+IBatisNet+Asp.net的开发框架的DAO的基类:BaseSqlMapDao内定义了一个内部类来辅助模糊查询.内部类代码如下:protected internal  class KeyWordSearch   {   private IList keywordList = new ArrayList(); public KeyWordSearch(String keywords)    {    StringTok