三十、Elasticsearch的Java API使用

package com.it.es;

import org.elasticsearch.action.bulk.BulkItemResponse;
import org.elasticsearch.action.bulk.BulkRequestBuilder;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequestBuilder;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.get.MultiGetItemResponse;
import org.elasticsearch.action.get.MultiGetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexRequestBuilder;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateRequestBuilder;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.geo.GeoPoint;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.common.unit.DistanceUnit;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.script.ScriptType;
import org.elasticsearch.script.mustache.SearchTemplateRequestBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.transport.client.PreBuiltTransportClient;

import javax.xml.bind.SchemaOutputResolver;
import java.io.IOException;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;

import static org.elasticsearch.index.query.QueryBuilders.*;

/**
 * @author zhuxingyu
 *
 */
public class UpsertCarInfoApp {


    private static TransportClient client;

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        //client集群自动探查client.transport.sniff使用上述的settings配置,将client.transport.sniff设置为true即可打开集群节点自动探查功能
        Settings setting = Settings.builder().put("cluster.name", "elasticsearch")
                .put("client.transport.sniff", true).build();     
        client = new PreBuiltTransportClient(setting)
                .addTransportAddresses(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));

        //  upsert();
        // multiGet();
        //bulk();
        //scroll();
        // template();
        // query();
        geoPoint();
        client.close();

    }

    /**
     *  区域定位查询
     */
    private static void geoPoint() {
        /**
         * 1、引入依赖
         * <dependency>
         *     <groupId>org.locationtech.spatial4j</groupId>
         *     <artifactId>spatial4j</artifactId>
         *     <version>0.6</version>
         * </dependency>
         *
         * <dependency>
         *     <groupId>com.vividsolutions</groupId>
         *     <artifactId>jts</artifactId>
         *     <version>1.13</version>
         *     <exclusions>
         *         <exclusion>
         *             <groupId>xerces</groupId>
         *             <artifactId>xercesImpl</artifactId>
         *         </exclusion>
         *     </exclusions>
         * </dependency>
         * 2、设置mapping
         * POST /car_shop/_mapping/shops
         * {
         *   "properties": {
         *       "pin": {
         *           "properties": {
         *               "location": {
         *                   "type": "geo_point"
         *               }
         *           }
         *       }
         *   }
         * }
         *
         * 3、设置一个4s店
         * PUT /car_shop/shops/1
         * {
         *     "name": "上海至全宝马4S店",
         *     "pin" : {
         *         "location" : {
         *             "lat" : 40.12,
         *             "lon" : -71.34
         *         }
         *     }
         * }
         */
        //第一个需求:搜索两个坐标点组成的一个区域
        QueryBuilder queryBuilder = geoBoundingBoxQuery("pin.location").setCorners(40.73, -74.1, 40.01, -71.12);
        SearchResponse response = client.prepareSearch("car_shop").setTypes("shops")
                .setQuery(queryBuilder).get();
        for (SearchHit searchHit : response.getHits().getHits()) {
            System.out.println(searchHit.getSourceAsString());
        }
        System.out.println("====================================================");
        //第二个需求:指定一个区域,由三个坐标点,组成
        List<GeoPoint> points = new ArrayList<GeoPoint>();
        points.add(new GeoPoint(40.73, -74.1));
        points.add(new GeoPoint(40.01, -71.12));
        points.add(new GeoPoint(50.56, -90.58));

        response = client.prepareSearch("car_shop")
                .setTypes("shops")
                .setQuery(QueryBuilders.geoPolygonQuery("pin.location", points))
                .get();

        for (SearchHit searchHit : response.getHits().getHits()) {
            System.out.println(searchHit.getSourceAsString());
        }
        System.out.println("====================================================");
        //第三个需求:搜索距离当前位置在200公里内的4s店
        response = client.prepareSearch("car_shop")
                .setTypes("shops")
                .setQuery(QueryBuilders.geoDistanceQuery("pin.location")
                        .point(40, -70)
                        .distance(200, DistanceUnit.KILOMETERS))
                .get();

        for (SearchHit searchHit : response.getHits().getHits()) {
            System.out.println(searchHit.getSourceAsString());
        }
    }

    /**
     * 多种查询
     */
    private static void query() {
        System.out.println("=====================检索===============================");
        SearchResponse searchResponse = client.prepareSearch("car_shop").setTypes("cars")
                .setQuery(QueryBuilders.matchQuery("brand", "宝马")).get();
        for (SearchHit searchHit : searchResponse.getHits().getHits()) {
            System.out.println(searchHit.getSourceAsString());
        }
        System.out.println("========================多字段检索============================");
        searchResponse = client.prepareSearch("car_shop").setTypes("cars")
                .setQuery(QueryBuilders.multiMatchQuery("奔驰", "brand", "name")).get();
        for (SearchHit searchHit : searchResponse.getHits().getHits()) {
            System.out.println(searchHit.getSourceAsString());
        }
        System.out.println("========================termQuery过虑============================");
        searchResponse = client.prepareSearch("car_shop").setTypes("cars")
                .setQuery(QueryBuilders.termQuery("brand.raw", "华晨宝马")).get();
        for (SearchHit searchHit : searchResponse.getHits().getHits()) {
            System.out.println(searchHit.getSourceAsString());
        }
        System.out.println("========================前缀批配============================");
        searchResponse = client.prepareSearch("car_shop").setTypes("cars")
                .setQuery(QueryBuilders.prefixQuery("brand", "宝")).get();
        for (SearchHit searchHit : searchResponse.getHits().getHits()) {
            System.out.println(searchHit.getSourceAsString());
        }
        System.out.println("========================多种条件的组合搜索========================");
        QueryBuilder queryBuilder = boolQuery().must(matchQuery("brand", "宝马"))
                .mustNot(termQuery("name.raw", "宝马318"))
                .should(termQuery("produce_date", "2017-01-01"))
                .filter(rangeQuery("price").gte("280000").lt("400000000"));
        SearchResponse response = client.prepareSearch("car_shop").setTypes("cars")
                .setQuery(queryBuilder).get();
        for (SearchHit searchHit : response.getHits().getHits()) {
            System.out.println(searchHit.getSourceAsString());
        }
    }

    /**
     * es模板调用
     */
    private static void template() {
        Map<String, Object> scriptParams = new HashMap();
        scriptParams.put("from", 0);
        scriptParams.put("size", 1);
        scriptParams.put("brand", "奔驰");
        //在es安装目录下\config\scripts\page_query_by_brand.mustache文件,放入脚本
        /**
         *
         *{
         *   "from": {{from}},
         *   "size": {{size}},
         *   "query": {
         *     "match": {
         *       "brand.keyword": "{{brand}}"
         *     }
         *   }
         * }
         */
        SearchResponse searchResponse = new SearchTemplateRequestBuilder(client).setScript("page_query_by_brand")
                .setScriptType(ScriptType.FILE).setScriptParams(scriptParams)
                .setRequest(new SearchRequest("car_shop").types("cars"))
                .get().getResponse();
        for (SearchHit searchHit : searchResponse.getHits().getHits()) {
            System.out.println(searchHit.getSourceAsString());
        }
    }

    /**
     * 使用Scroll批量查询,可以实现文件导出
     */
    private static void scroll() {
        SearchResponse searchResponse = client.prepareSearch("car_shop").setTypes("cars")
                .setQuery(QueryBuilders.termQuery("brand.raw", "奔驰"))//brand.raw是用的不分词类型 keyword
                .setScroll(new TimeValue(60000)).setSize(2).get();//setSize一次查询多少条
        int batchCount = 0;
        do {
            for (SearchHit searchHit : searchResponse.getHits().getHits()) {
                System.out.println("batch:" + ++batchCount);
                System.out.println(searchHit.getSourceAsString());
                // 每次查询一批数据,比如1000行,然后写入本地的一个excel文件中
                // 如果说你一下子查询几十万条数据,不现实,jvm内存可能都会爆掉
            }
            System.out.println("-----------------");
            searchResponse = client.prepareSearchScroll(searchResponse.getScrollId()).setScroll(new TimeValue(60000))
                    .execute().actionGet();
        } while (searchResponse.getHits().getHits().length != 0);
    }

    /**
     * bulk实现增删改
     * @throws IOException
     */
    private static void bulk() throws IOException {
        //新增
        BulkRequestBuilder bulkRequestBuilder = client.prepareBulk();
        IndexRequestBuilder indexRequestBuilder = client.prepareIndex("car_shop", "cars", "3");
        indexRequestBuilder.setSource(XContentFactory.jsonBuilder().startObject().field("brand", "奔驰")
                .field("name", "奔驰C200")
                .field("price", 350000)
                .field("produce_date", "2017-01-20")
                .field("sale_price", 320000)
                .field("sale_date", "2017-01-25").endObject());
        bulkRequestBuilder.add(indexRequestBuilder);
        //修改
        UpdateRequestBuilder update = client.prepareUpdate("car_shop", "cars", "1").setDoc(
                XContentFactory.jsonBuilder().startObject().field("price", "100000000").endObject()
        );
        bulkRequestBuilder.add(update);
        DeleteRequestBuilder delete = client.prepareDelete("car_shop", "sales", "3");
        bulkRequestBuilder.add(delete);
        BulkResponse bulkResponse = bulkRequestBuilder.get();
        for (BulkItemResponse bulkItemResponse : bulkResponse.getItems()) {
            System.out.println(bulkItemResponse.getResponse());
        }
    }

    /**
     * 一次查多个
     */
    private static void multiGet() {
        MultiGetResponse multiGetResponses = client.prepareMultiGet().add("car_shop", "cars", "1").add("car_shop", "cars", "2").get();
        for (MultiGetItemResponse itemResponse : multiGetResponses) {
            GetResponse response = itemResponse.getResponse();
            if (response.isExists()) {
                System.out.println(response.getSourceAsString());
            }
        }
    }

    /**
     *upsert实现汽车最新价格的调整
     * @throws IOException
     * @throws InterruptedException
     * @throws ExecutionException
     */
    private static void upsert() throws Exception {
        IndexRequest indexRequest = new IndexRequest("car_shop", "cars", "2").source(
                XContentFactory.jsonBuilder()
                        .startObject().field("brand", "宝马")
                        .field("name", "宝马c200")
                        .field("price", 350000)
                        .field("produce_date", "2017-01-01")
                        .endObject());
        System.out.println("index end:");
        UpdateRequest updateRequest = new UpdateRequest("car_shop", "cars", "1")
                .doc(XContentFactory.jsonBuilder()
                        .startObject().field("price", 310000).endObject()).upsert(indexRequest);
        UpdateResponse updateResponse = client.update(updateRequest).get();
        System.out.println(updateResponse.getVersion());
    }

}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,589评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,615评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,933评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,976评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,999评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,775评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,474评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,359评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,854评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,007评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,146评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,826评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,484评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,029评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,153评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,420评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,107评论 2 356

推荐阅读更多精彩内容