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。

原文地址:https://www.cnblogs.com/qianshuixianyu/p/9289916.html