第十七篇:elasticsearch java API的使用

首先添加上maven依赖:

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>transport</artifactId>
    <version>5.2.2</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.7</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.7</version>
</dependency>

创建一个log4j2.properties

appender.console.type = Console
appender.console.name = console
appender.console.layout.type = PatternLayout

rootLogger.level = info
rootLogger.appenderRef.console.ref = console

步入正题:

1、基于java实现简单增删改查

1、构建client

Settings settings = Settings.builder()
        .put("cluster.name", "myClusterName").build();
TransportClient client = new PreBuiltTransportClient(settings);

TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
        .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host1"), 9300))
        .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host2"), 9300));

client.close();

注:此端口不能使用9200,需要使用9300,具体的区别在安装elasticsearch那张有提到。

2、构建document

IndexResponse response = client.prepareIndex("index", "type", "1")
        .setSource(jsonBuilder()
                    .startObject()
                        .field("user", "kimchy")
                        .field("postDate", new Date())
                        .field("message", "trying out Elasticsearch")
                    .endObject()
                  )
        .get();

3、查询document

GetResponse response = client.prepareGet("index", "type", "1").get();

4、修改document

client.prepareUpdate("index", "type", "1")
        .setDoc(jsonBuilder()               
            .startObject()
                .field("gender", "male")
            .endObject())
        .get();

5、删除document

DeleteResponse response = client.prepareDelete("index", "type", "1").get();

2、基于java对elasticsearch进行复杂的搜索操作

需求:
(1)搜索职位中包含technique的员工
(2)同时要求age在30到40岁之间
(3)分页查询,查找第一页

        SearchResponse response = client.prepareSearch("company")
                .setTypes("employee")
                .setQuery(QueryBuilders.matchQuery("position","technique"))
                .setPostFilter(QueryBuilders.rangeQuery("age").from(30).to(40))
                .setFrom(0).setSize(1)
                .get();

3、基于java对elasticsearch进行聚合分析

需求:
(1)首先按照country国家来进行分组
(2)然后在每个country分组内,再按照入职年限进行分组
(3)最后计算每个分组内的平均薪资

        SearchResponse searchResponse = client.prepareSearch("company")
                .addAggregation(AggregationBuilders.terms("group_by_county").field("country")
                .subAggregation(AggregationBuilders
                .dateHistogram("group_by_join_date")
                .field("join_date")
                .dateHistogramInterval(DateHistogramInterval.YEAR)
                .subAggregation(AggregationBuilders.avg("avg_salary").field("salary"))))
                .execute().actionGet();

4、client集群自动探查

默认情况下,是根据我们手动指定的所有节点,依次轮询这些节点,来发送各种请求的,如下面的代码,我们可以手动为client指定多个节点:

TransportClient client = new PreBuiltTransportClient(settings)
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost1"), 9300))
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost2"), 9300))
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost3"), 9300));

但如果有成百上千的节点的话这个方法就不合适了,elasticsearch client提供了一种集群节点自耦东探查的功能:

Settings settings = Settings.builder()
        .put("client.transport.sniff", true).build();
TransportClient client = new PreBuiltTransportClient(settings);

使用上述的settings配置,将client.transport.sniff设置为true即可打开集群节点自动探查功能

5、汽车零售店案例

5.1、基于upsert实现汽车最新价格的调整

先建好索引:

PUT /car_shop
{
    "mappings": {
        "cars": {
            "properties": {
                "brand": {
                    "type": "text",
                    "analyzer": "ik_max_word",
                    "fields": {
                        "raw": {
                            "type": "keyword"
                        }
                    }
                },
                "name": {
                    "type": "text",
                    "analyzer": "ik_max_word",
                    "fields": {
                        "raw": {
                            "type": "keyword"
                        }
                    }
                }
            }
        }
    }
}

java API具体代码实现:

        IndexRequest indexRequest = new IndexRequest("car_shop","cars","1")
                .source(XContentFactory.jsonBuilder()
                    .startObject()
                        .field("brand","宝马")
                        .field("name","宝马320")
                        .field("price", 30000)
                        .field("produce_date","2017-01-01")
                     .endObject());

        UpdateRequest upsert = new UpdateRequest("car_shop", "cars", "1")
                .doc(XContentFactory.jsonBuilder()
                        .startObject()
                        .field("price", 3100111)
                        .endObject())
                .upsert(indexRequest);

        client.update(upsert).get();

5.2、基于mget实现多辆汽车的配置与价格对比

        MultiGetResponse multiGetItemResponses = client.prepareMultiGet()
                .add("car_shop", "cars", "1")
                .add("car_shop", "cars", "2")
                .get();

        for (MultiGetItemResponse multiGetItemResponse : multiGetItemResponses) {
            GetResponse response = multiGetItemResponse.getResponse();
            if(response.isExists()) {
                System.out.println(response.getSourceAsString());
            }
        }

猜你喜欢

转载自blog.csdn.net/r_p_j/article/details/78461669