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

来源:互联网 发布:ubuntu怎么看硬盘大小 编辑:程序博客网 时间:2024/05/01 08:28

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

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

<!--elasticsearch及其依赖包--><dependency>    <groupId>org.elasticsearch</groupId>    <artifactId>elasticsearch</artifactId>    <version>2.2.1</version></dependency><!--Google的json转换插件gson--><dependency>    <groupId>com.google.code.gson</groupId>    <artifactId>gson</artifactId>    <version>2.3</version></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("<span class='searchKey'>")                .setHighlighterPostTags("</san>")                .setFrom(0)                .setSize(10)                .execute().actionGet();        for (SearchHit hit: res.getHits()) {            Map<String, HighlightField> 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();    }