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

}

and or

 //搜索内容设置>>>>>>>>>>>>>>>>>>>>>>  
//索引"student_manage"是索引"student"、"class"、"course_info"共同的别名  
SearchRequestBuilder searchRequestBuilder = client.prepareSearch("student_manage");  
//searchRequestBuilder.setTypes(type);  
searchRequestBuilder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH);  
......  
  
//开始过滤>>>>>>>>>>>>>>>>>>>>>>  
   //************过滤条件中,must相当于and,should相当于or,must_not相当于not*****************//  
//过滤条件1  
org.elasticsearch.index.query.QueryBuilder postFilter1= QueryBuilders  
        .boolQuery()  
        .must(QueryBuilders.termsQuery("_index", "student"))  
        .must(QueryBuilders.termsQuery("sex", "male"))  
        .must(QueryBuilders.termsQuery("age", "16","17"));  
//过滤条件2  
org.elasticsearch.index.query.QueryBuilder postFilter2= QueryBuilders  
        .boolQuery()  
        .must(QueryBuilders.termsQuery("_index", "class"))  
        .must(QueryBuilders.termsQuery("type", "math"))  
        .must(QueryBuilders.boolQuery().should(QueryBuilders.termsQuery("num", "6","8")));  
//过滤条件3  
org.elasticsearch.index.query.QueryBuilder postFilter3= QueryBuilders  
        .boolQuery()  
        .must(QueryBuilders.termsQuery("_index", "course_info"))  
        .must(QueryBuilders.termsQuery("isopen", "1"))  
        .must(QueryBuilders.termsQuery("status", "2"))  
        .must(QueryBuilders.termsQuery("grade", "2"));  
//整合三者过滤条件(OR)  
org.elasticsearch.index.query.QueryBuilder postFilterBool =QueryBuilders.boolQuery()  
        .should(postFilter1)  
        .should(postFilter2)  
        .should(postFilter3);  
searchRequestBuilder.setPostFilter(postFilterBool);  
//执行搜索>>>>>>>>>>>>>>>>>>>>>>  
SearchResponse res = searchRequestBuilder.execute().actionGet();  
posted @ 2022-04-14 01:38  方东信  阅读(127)  评论(0编辑  收藏  举报