ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

elasticsearch java api

2022-04-14 02:00:30  阅读:100  来源: 互联网

标签:java System client api elasticsearch import println org


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());
    }

}

标签:java,System,client,api,elasticsearch,import,println,org
来源: https://www.cnblogs.com/cfas/p/16142881.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有