ElasticSearch搜索引擎java客户端接口详解

官方文档详见:http://www.elasticsearch.org/guide/en/elasticsearch/client/java-api/current/

本次测试使用Maven坐标如下:


<dependency>
    <groupId>org.elasticsearchgroupId>
    <artifactId>elasticsearchartifactId>
    <version>2.2.1version>
dependency>

<dependency>
    <groupId>com.google.code.gsongroupId>
    <artifactId>gsonartifactId>
    <version>2.3version>
dependency>

一、获取与关闭客户端方式:这里只用一种,另一种详见官网

public static void main(String[] args) throws UnknownHostException {
        // on startup
        Client client = TransportClient.builder().build()
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.200.129"), 9300));

        // on shutdown
        client.close();
    }

二、创建索引方式:


(1)第一种方式:

//此处可以使用jackson包下ObjectMapper解析,本次使用gson
    public static void indexCreate(Client client ) {
        Map<String,Object> map = Maps.newHashMap();
        map.put("title", "今晚打老虎");
        map.put("body", "号称是赌圣的存在,1937年某一天今晚打老虎");
        map.put("publish", "2016-12-5");
        String s = new Gson().toJson(map);//
        IndexResponse res = null;
       /*第一个参数索引名称,第二个参数类型名称,与关系型数据库对应大致为:索引相当于数据库名,类型相当于表名*/
        res = client.prepareIndex("chupengfei","xiaofei").setSource(s).execute().actionGet();
        System.out.println(res);

    //------------------------------------------------------------------

        // 索引名称
        String _index = res.getIndex();
        System.out.println("_index: "+_index);
        // 类型名称
        String _type = res.getType();
        System.out.println("_type: "+_type);
        // 文档id
        String _id = res.getId();
        System.out.println("_id: "+_id);
        // 版本(if it's the first time you index this document, you will get: 1)
        long _version = res.getVersion();
        System.out.println("_version: "+_version);
        // 是否被创建is true if the document is a new one, false if it has been updated
        boolean created = res.isCreated();
        System.out.println("created: "+created);
        // on shutdown
        client.close();
    }

(2)第二种方式:

//Elasticsearch提供内置的助手生成JSON内容
    public static void indexCreate(Client client ) {
         String jsonSource = "";
        try {
            XContentBuilder contentBuilder = XContentFactory.jsonBuilder()
                    .startObject();
            contentBuilder.field("title", "今晚打老虎");
            contentBuilder.field("body", "号称是赌圣的存在,1937年某一天今晚打老虎");
            contentBuilder.field("publish", "2016-12-5");
            jsonSource = contentBuilder.endObject().string();
        } catch (IOException e) {
            e.printStackTrace();
        }
        IndexResponse res = null;
        res = client.prepareIndex("chupengfei","xiaofei").setSource(jsonSource ).execute().actionGet();
        System.out.println(res);
        // on shutdown
        client.close();
    }

三、获取索引方式:

public static void indexGet(Client client ) {
        SearchResponse res = null;
        res = client.prepareSearch("chupengfei").setTypes("xiaofei").get();

        System.out.println(res);
        // on shutdown
        client.close();
    }

四、删除索引方式:

public static void indexDelete(Client client, String id ) {

        DeleteResponse res = null;
        res = client.prepareDelete("api_test","type_test", id).execute().actionGet();
        System.out.println(res.isFound());
        // on shutdown
        client.close();
    }

五、更新索引方式:

public static void update(Client client ) throws IOException, InterruptedException, ExecutionException {
        UpdateRequest req = new UpdateRequest();
        req.index("search_test");
        req.type("article");
        req.id("5");
        req.doc(jsonBuilder().startObject().field("title", "褚鹏飞222").field("body", "阳光大男孩").endObject());
        client.update(req).get();
        client.close();
    }

六、批量更新索引方式:

public static void bulkUpdate(Client client ) throws IOException, InterruptedException, ExecutionException {

        BulkRequestBuilder req = client.prepareBulk();
        req.add(client.prepareIndex("search_test","article","2")
                    .setSource(jsonBuilder()
                            .startObject()
                            .field("title","bulk title 02 04-05")));
        req.add(client.prepareIndex("search_test","article","3")
                .setSource(jsonBuilder()
                        .startObject()
                        .field("title","bulk title 03 04-05")));
        req.add(client.prepareIndex("search_test","article","4")
                .setSource(jsonBuilder()
                        .startObject()
                        .field("title","bulk title 04 04-05")));
        BulkResponse res = req.execute().actionGet();       

        if (res.hasFailures()){
            System.out.println("Error");
        } else {
            System.out.println("Done");
        }


        client.close();
    }

七、使用java api 实现简单查询:


(1)方式一:

public static void matchAllQuery(Client client ) {
        SearchResponse res = null;
        QueryBuilder qb = QueryBuilders.matchAllQuery();

        res = client.prepareSearch("search_test")
                .setTypes("article")
                .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
                .setQuery(qb)
                .setFrom(0)
                .setSize(10)
                .execute().actionGet();
        for (SearchHit hit: res.getHits().getHits()){
            System.out.println(hit.getSourceAsString());
        }

        // on shutdown
        client.close();
    }

(2)方式二:

public static void matchQuery(Client client ) {
        SearchResponse res = null;
        QueryBuilder qb = QueryBuilders.matchQuery("title", "bulk");

        res = client.prepareSearch("search_test")
                .setTypes("article")
                .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
                .setQuery(qb)
                .setFrom(0)
                .setSize(10)
                .execute().actionGet();
        for (SearchHit hit: res.getHits().getHits()){
            System.out.println(hit.getSourceAsString());
        }

        // on shutdown
        client.close();
    }

(3)方式三:

public static void multiMatchQuery(Client client ) {
        SearchResponse res = null;
        QueryBuilder qb = QueryBuilders
                .multiMatchQuery("article","title", "body");

        res = client.prepareSearch("search_test")
                .setTypes("article")
                .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
                .setQuery(qb)
                .setFrom(0)
                .setSize(10)
                .execute().actionGet();
        for (SearchHit hit: res.getHits().getHits()) { 
            System.out.println(hit.getSourceAsString());
        }

        // on shutdown
        client.close();
    }

(4)方式四:

public static void commonTermQuery(Client client ) {
        SearchResponse res = null;
        QueryBuilder qb = QueryBuilders
                .commonTermsQuery("title","article");

        res = client.prepareSearch("search_test")
                .setTypes("article")
                .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
                .setQuery(qb)
                .setFrom(0)
                .setSize(10)
                .execute().actionGet();
        for (SearchHit hit: res.getHits().getHits()) {
            System.out.println(hit.getSourceAsString());
        }

        // on shutdown
        client.close();

        //common terms query
    }

(5)方式五:

public static void termQuery(Client client ) {
        SearchResponse res = null;
        /*QueryBuilder qb = QueryBuilders
                .termQuery("title","bulk");*/

        QueryBuilder qb = QueryBuilders
                .termsQuery("title","bulk");

        res = client.prepareSearch("search_test")
                .setTypes("article")
                .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
                .setQuery(qb)
                .addHighlightedField("title")
                .setHighlighterPreTags("")
                .setHighlighterPostTags("")
                .setFrom(0)
                .setSize(10)
                .execute().actionGet();
        for (SearchHit hit: res.getHits()) {
            Map result = hit.highlightFields();
            HighlightField highlightedSummary = result.get("title");
            Text[] titleTexts = highlightedSummary.getFragments();
            String allFragments = "";
            for (Text text: titleTexts){
                allFragments += text;
            }
            System.out.println(result);
            System.out.println(allFragments);       
        }

        // on shutdown
        client.close();

        //common terms query
    }

(6)方式六:

public static void rangeQuery(Client client ) {
        SearchResponse res = null;

        QueryBuilder qb = QueryBuilders
                .rangeQuery("like")
                .gte(5)
                .lt(7);


//      QueryBuilder qb = QueryBuilders
//              .rangeQuery("like")
//              .from(5)
//              .to(7)
//              .includeLower(true)
//              .includeUpper(false);


        res = client.prepareSearch("search_test")
                .setTypes("article")
                .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
                .setQuery(qb)
                .setFrom(0)
                .setSize(10)
                .execute().actionGet();
        for (SearchHit hit: res.getHits().getHits()) {
            System.out.println(hit.getSourceAsString());
        }

        // on shutdown
        client.close();

        //common terms query
    }

(7)方式七:

public static void othersQuery(Client client ) {
        SearchResponse res = null;

        QueryBuilder qb = QueryBuilders.existsQuery("str");
        //QueryBuilder qb = QueryBuilders.prefixQuery("name", "prefix");
        //QueryBuilder qb = QueryBuilders.wildcardQuery("user", "k?mc*");
        //QueryBuilder qb = QueryBuilders.regexpQuery("user", "k.*y");
        //QueryBuilder qb = QueryBuilders.fuzzyQuery("name", "kimzhy");
        //QueryBuilder qb = QueryBuilders.typeQuery("my_type");
        //QueryBuilder qb = QueryBuilders.idsQuery("my_type","type2").addIds("1","2","5");



        res = client.prepareSearch("search_test")
                .setTypes("article")
                .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
                .setQuery(qb)
                .setFrom(0)
                .setSize(10)
                .execute().actionGet();
        for (SearchHit hit: res.getHits().getHits()) {
            System.out.println(hit.getSourceAsString());
        }

        // on shutdown
        client.close();

        //common terms query
    }

八、使用java api 实现复合查询:


(1)方式一:

public static void constantScoreQuery(Client client ) {
        SearchResponse res = null;
        QueryBuilder qb = QueryBuilders
                .constantScoreQuery(QueryBuilders.termQuery("title","article"))
                .boost(2.0f);

        res = client.prepareSearch("search_test")
                .setTypes("article")
                .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
                .setQuery(qb)
                .setFrom(0)
                .setSize(10)
                .execute().actionGet();
        for (SearchHit hit: res.getHits().getHits()) {
            System.out.println(hit.getSourceAsString());
        }

        // on shutdown
        client.close();
    }

(2)方式二:

public static void booQuery(Client client ) {
        SearchResponse res = null;
        QueryBuilder qb = QueryBuilders.boolQuery()
                .must(QueryBuilders.termQuery("title","article"))
                .mustNot(QueryBuilders.termQuery("title","relevance"))
                .should(QueryBuilders.termQuery("title","article"))
                .filter(QueryBuilders.termQuery("title","article"));


        res = client.prepareSearch("search_test")
                .setTypes("article")
                .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
                .setQuery(qb)
                .setFrom(0)
                .setSize(10)
                .execute().actionGet();
        for (SearchHit hit: res.getHits().getHits()){
            System.out.println(hit.getSourceAsString());
        }

        // on shutdown
        client.close();
    }

(3)方式三:

public static void disMaxQuery(Client client ) {
        SearchResponse res = null;
        QueryBuilder qb = QueryBuilders
                .disMaxQuery()
                .add(QueryBuilders.termQuery("title","article"))
                .add(QueryBuilders.termQuery("title","relevance")).boost(1.2f).tieBreaker(0.7f);

        res = client.prepareSearch("search_test")
                .setTypes("article")
                .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
                .setQuery(qb)
                .setFrom(0)
                .setSize(10)
                .execute().actionGet();
        for (SearchHit hit: res.getHits().getHits()) { 
            System.out.println(hit.getSourceAsString());
        }

        // on shutdown
        client.close();
    }

九、使用java api 实现聚合查询:


(1)方式一:

public static void avgQuery(Client client ) {
        SearchResponse res = null;
        AvgBuilder agg = AggregationBuilders
                .avg("avg_num")
                .field("like");

        res = client.prepareSearch("search_test")
                .setTypes("article")
                .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
                .addAggregation(agg)
                .setFrom(0)
                .setSize(10)
                .execute().actionGet();
        System.out.println(res);

        // on shutdown
        client.close();
    }

(2)方式二:


public static void minQuery(Client client ) {
        SearchResponse res = null;
        MinBuilder agg = AggregationBuilders
                .min("min_num")
                .field("like");

        res = client.prepareSearch("search_test")
                .setTypes("article")
                .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
                .addAggregation(agg)
                .setFrom(0)
                .setSize(10)
                .execute().actionGet();
        System.out.println(res);

        // on shutdown
        client.close();
    }

(3)方式三:


public static void maxQuery(Client client ) {
        SearchResponse res = null;
        MaxBuilder agg = AggregationBuilders
                .max("max_num")
                .field("like");

        res = client.prepareSearch("search_test")
                .setTypes("article")
                .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
                .addAggregation(agg)
                .setFrom(0)
                .setSize(10)
                .execute().actionGet();
        System.out.println(res);

        // on shutdown
        client.close();
    }

(4)方式四:


public static void extendedStatsQuery(Client client ) {
        SearchResponse res = null;
        ExtendedStatsBuilder agg = AggregationBuilders
                .extendedStats("extended_stats_num")
                .field("like");

        res = client.prepareSearch("search_test")
                .setTypes("article")
                .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
                .addAggregation(agg)
                .setFrom(0)
                .setSize(10)
                .execute().actionGet();
        System.out.println(res);

        // on shutdown
        client.close();
    }

(5)方式五:


@SuppressWarnings("rawtypes")
    public static void valueCountQuery(Client client ) {
        SearchResponse res = null;

        MetricsAggregationBuilder agg =
                AggregationBuilders
                        .count("agg")
                        .field("like");

        res = client.prepareSearch("search_test")
                .setTypes("article")
                .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
                .addAggregation(agg)
                .setFrom(0)
                .setSize(10)
                .execute().actionGet();
        System.out.println(res);

        // on shutdown
        client.close();
    }

(6)方式六:


public static void percentileQuery(Client client ) {
        SearchResponse res = null;
        PercentilesBuilder agg = AggregationBuilders
                .percentiles("percentile_num")
                .field("like")
                .percentiles(95,99,99.9);

        res = client.prepareSearch("search_test")
                .setTypes("article")
                .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
                .addAggregation(agg)
                .setFrom(0)
                .setSize(10)
                .execute().actionGet();
        System.out.println(res);

        // on shutdown
        client.close();
    }

(7)方式七:

public static void percentileRankQuery(Client client ) {
        SearchResponse res = null;
        PercentileRanksBuilder agg = AggregationBuilders
                .percentileRanks("percentile_rank_num")
                .field("like")
                .percentiles(3,5);

        res = client.prepareSearch("search_test")
                .setTypes("article")
                .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
                .addAggregation(agg)
                .setFrom(0)
                .setSize(10)
                .execute().actionGet();
        System.out.println(res);

        // on shutdown
        client.close();
    }

(8)方式八:

@SuppressWarnings("rawtypes")
    public static void rangeQuery(Client client ) {
        SearchResponse res = null;

        AggregationBuilder agg =
                AggregationBuilders
                        .range("agg")
                        .field("like")
                        .addUnboundedTo(3)
                        .addRange(3, 5)
                        .addUnboundedFrom(5);  
        res = client.prepareSearch("search_test")
                .setTypes("article")
                .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
                .addAggregation(agg)
                .setFrom(0)
                .setSize(0)
                .execute().actionGet();
        System.out.println(res);

        // on shutdown
        client.close();
    }

(9)方式九:

@SuppressWarnings("rawtypes")
    public static void histogramQuery(Client client ) {
        SearchResponse res = null;

        AggregationBuilder agg =
                AggregationBuilders
                        .histogram("agg")
                        .field("like")
                        .interval(2);
        res = client.prepareSearch("search_test")
                .setTypes("article")
                .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
                .addAggregation(agg)
                .setFrom(0)
                .setSize(0)
                .execute().actionGet();
        System.out.println(res);

        // on shutdown
        client.close();
    }

(10)方式十:


@SuppressWarnings("rawtypes")
    public static void dateHistogramQuery(Client client ) {
        SearchResponse res = null;

        AggregationBuilder agg =
                AggregationBuilders
                        .dateHistogram("agg")
                        .field("publish_date")
                        .interval(DateHistogramInterval.YEAR)
                        .minDocCount(1);
        res = client.prepareSearch("search_test")
                .setTypes("article")
                .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
                .addAggregation(agg)
                .setFrom(0)
                .setSize(0)
                .execute().actionGet();
        System.out.println(res);

        // on shutdown
        client.close();
    }

你可能感兴趣的:(Java)