zoukankan      html  css  js  c++  java
  • JAVA API查找和添加elasticsearch内容

    本章主要讲解一种添加和三种查找功能,我们分别以代码形式进行讲解,欢迎各位积极讨论。

    首先,应用java导包是必须的,我们创建maven项目后,在pom.xml文件中,进行导包。所需要包可在maven elasticsearch官网查询。

    <dependencies>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>6.3.0</version>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.5</version>
        </dependency>
    
    </dependencies>

    导包完成后,即可进行下面的步骤。

    1.ES文本内容的添加jsonBuilder(

    2.ES文本内容查找:

      (1)全文查询:SearchResponse-preparesearch

      (2)模糊查询:QueryBuilders()

      (3)聚合查询:AggregationBuilders()

    下面开始代码讲解:

    1.文本添加

    import...
    import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
    
    public class Demol4 {
        public static void main(String[] args) throws Exception {
            TransportClient client=new PreBuiltTransportClient(Settings.EMPTY)
                    .addTransportAddress(new TransportAddress(InetAddress.getByName("localhost"), 9300))
                    ;
    
            XContentBuilder builder = jsonBuilder()
                    .startObject()
                    .field("first_name", "gou gou")
                    .field("last_name","smith")
                    .field("about", "trying out Elasticsearch")
                    .field("interests","music,act")
                    .endObject();
            IndexResponse response=client.prepareIndex("megacorp","employee").setSource(builder).get();
            System.out.println(response);
            client.close();
    
        }
    }

    在一个main方法中,我们首先需要用TransportClient的子类PreBuiltTransportClient去连接我们的elasticsearch,注意java连接es的端口号是9300。治理这里是以new对象的形式进行使用,并设置为空,通过IP地址添加新的连接。

      文本添加的jsonBuilder是以对象的开始(startObject)和结束(endObject)为标志,在其中以属性field的方式添加。其中添加的需要有name和value。内容填写完毕后,需要增加到elasticsearch中,使用索引IndexResponse类型的prepareIndex方法,参数为地址索引和类型索引,将文件添加是setSource(对象).get()。

      这样就将文件添加到了elasticsearch中,并可以查询了。

    2.全文查询

    public class Demol1 {
        public static void main(String[]args)throws Exception{
            TransportClient client=new PreBuiltTransportClient(Settings.EMPTY)
                    .addTransportAddress(new TransportAddress(InetAddress.getByName("localhost"), 9300))
                    ;
            SearchResponse response=client.prepareSearch("megacorp").setTypes("employee").get();
            System.out.print(response);
            SearchHit[] hits=response.getHits().getHits();
    
            for(SearchHit sh:hits){
                System.out.println();
                Map<String,Object> data=sh.getSourceAsMap();
                String full_name=data.get("first_name")+"."+data.get("last_name");
                String age=data.get("age").toString();
                String about=data.get("about").toString();
                List<String> interests= (List<String>) data.get("interests");
                System.out.println(full_name+"	"+age+"	"+about);
                for(String like:interests){
                    System.out.println(like);
                }
                System.out.println("---------------");
            }
            client.close();
    
        }
    }

    l连接部分不再赘述,查找内容,首先需要用SearchResponse类型的prepareSearch()方法找到相应的类型文档,以get()方法获取。获取的内容以数组形式SearchHit【】存储在hits中。通过getHist方法的重复使用,直接得到属性处的文本内容。

      对文本内容进行迭代输出,并以Map的形式接收,应用getSourceAsMap()方法。声明变量为得到的属性对应值,数组形式的变量以List<>数组形式接收并迭代输出。最终得到所有文本中,关于定义变量的属性对应的内容。

    3.模糊查询

    public class Demol3 {
        public static void main(String[] args) throws Exception {
            TransportClient client=new PreBuiltTransportClient(Settings.EMPTY)
                    .addTransportAddress(new TransportAddress(InetAddress.getByName("localhost"), 9300))
                    ;
    
            SearchResponse response=client.prepareSearch("megacorp").setTypes("employee").setQuery(
                     QueryBuilders.termsQuery("last_name","smith")
        //单条信息的查询,不适合在聚合情况下的查询,需要知道vlaue包含的值
    
            ).get();
            System.out.println(response);
            client.close();
    
        }
    }

      模糊查询的应用一样也是get()方法获取,不同的是,需要中间加入setQuery方法,并应用QueryBuilders.termsQuery()方法获取模糊查询的内容。其中需要知道属性以及属性内包含的值。然后可以直接输出。

    4.聚合查询

    public class Demol2 {
        public static void main(String[] args) throws Exception {
            TransportClient client=new PreBuiltTransportClient(Settings.EMPTY)
                    .addTransportAddress(new TransportAddress(InetAddress.getByName("localhost"), 9300))
                    ;
    
            SearchResponse response=client.prepareSearch("megacorp").setTypes("employee").addAggregation(
                    AggregationBuilders.terms("all_interests").field("interests").subAggregation(
                            AggregationBuilders.avg("avg_age").field("age")
                    )
            ).execute().actionGet();
            System.out.println(response);
            client.close();
    
        }
    }

    与模糊查询类似,只是方法需要改变,聚合查询的方法是通过添加聚合addAggregation()方法,并用AggregationBuilders方法,对聚合内部的属性进行查找,聚合属性可能是terms,也可能是avg,这要根据文档查询内容进行匹配。不同的是,聚合查找的属性值通过terms或avg确定后,属性值需要通过field方法进行跟进。

      对于嵌套式的聚合内容,执行在后面继续增加subAggregation方法,内部写法均类似。大多数聚合一般为两层最深,如果遇到更深层次的聚合,套用即可。

    说一下,这里的execute().actionnGet()=get(),内部可以做参数的配置,包括等待时间time等。最后记得关闭连接的client。

  • 相关阅读:
    【BZOJ 2124】【CodeVS 1283】等差子序列
    【BZOJ 1036】【ZJOI 2008】树的统计Count
    【BZOJ 1901】【ZJU 2112】Dynamic Rankings
    【BZOJ 3924】【ZJOI 2015】幻想乡战略游戏
    【BZOJ 4103】【THUSC 2015】异或运算
    【BZOJ 4513】【SDOI 2016】储能表
    【HDU 3622】Bomb Game
    【BZOJ 3166】【HEOI 2013】Alo
    【BZOJ 3530】【SDOI 2014】数数
    【BZOJ 4567】【SCOI 2016】背单词
  • 原文地址:https://www.cnblogs.com/qianshuixianyu/p/9289916.html
Copyright © 2011-2022 走看看