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。

  • 相关阅读:
    (转)Fiddler 教程
    (转)Web自动化测试之12306火车票网站自动登录工具
    (转)用c#来写个木马程序吧
    (转)windows phone 7 用户控件页面跳转
    (转)自学Windows Phone 7随笔
    (转)Windows Phone7页面导航
    (转)Asp.net生成htm静态文件的两种途径
    (转)HTTP协议详解
    (转)Web自动化测试之12306火车票网站自动登录工具
    收录一些位运算的技巧(不断更新)
  • 原文地址:https://www.cnblogs.com/qianshuixianyu/p/9289916.html
Copyright © 2011-2022 走看看