ELK(使用踩坑)

E:elastic
L:logstash
K:kibnan

es配置

elastic.host=服务器地址
elastic.port=9200
elastic.scheme=http
elastic.username=名称
elastic.password=密码

es工具类:



@Component
@ConditionalOnBean(value = RestHighLevelClient.class)
public class ElasticUtil {

    @Autowired
    RestHighLevelClient restHighLevelClient;

    /**
     * @param idxName   索引名称
     * @param idxSQL    索引描述
     * @return void
     * @throws Exception 
     * @throws
     * @since
     */
    public void createIndex(String idxName,String idxSQL) throws Exception{
        if (!this.indexExist(idxName)) {
            return;
        }
        CreateIndexRequest request = new CreateIndexRequest(idxName);
        buildSetting(request);
        request.mapping(idxSQL, XContentType.JSON);
        CreateIndexResponse res = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);
        if (!res.isAcknowledged()) {
            throw new RuntimeException("初始化失败");
        }
    }

    /** 断某个index是否存在
     * @param idxName index名
     * @return boolean
     * @throws
     * @since
     */
    public boolean indexExist(String idxName) throws Exception {
        GetIndexRequest request = new GetIndexRequest(idxName);
        request.local(false);
        request.humanReadable(true);
        request.includeDefaults(false);
        request.indicesOptions(IndicesOptions.lenientExpandOpen());
        return restHighLevelClient.indices().exists(request, RequestOptions.DEFAULT);
    }

    /** 断某个index是否存在
     * @throws
     * @since
     */
    public boolean isExistsIndex(String idxName) throws Exception {
        return restHighLevelClient.indices().exists(new GetIndexRequest(idxName),RequestOptions.DEFAULT);
    }

    /** 设置分片
     * @since
     */
    public void buildSetting(CreateIndexRequest request){
        request.settings(Settings.builder().put("index.number_of_shards",3)
                .put("index.number_of_replicas",2));
    }
    /**
     * @throws IOException 
     * @throws
     * @since
     */
    public void insertOrUpdateOne(String idxName, Elastic entity) throws IOException {
        IndexRequest request = new IndexRequest(idxName);
        request.id(entity.getId());
        request.source(JSON.toJSONString(entity.getData()), XContentType.JSON);
        restHighLevelClient.index(request, RequestOptions.DEFAULT);
    }

    /**
     * @since
     */
    public void deleteOne(String idxName, Elastic entity) {
        DeleteRequest request = new DeleteRequest(idxName);
        request.id(entity.getId());
        try {
            restHighLevelClient.delete(request,RequestOptions.DEFAULT);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /** 批量插入数据
     * @since
     */
    public void insertBatch(String idxName, List<Elastic> list) throws IOException {
        BulkRequest request = new BulkRequest();
        list.forEach(item -> request.add(new IndexRequest(idxName).id(item.getId())
                .source(JSON.toJSONString(item.getData()), XContentType.JSON)));
        restHighLevelClient.bulk(request, RequestOptions.DEFAULT);
    }

    /** 批量插入数据
     * @throws
     * @since
     */
    public void insertBatchTrueObj(String idxName, List<Elastic> list) throws IOException {
        BulkRequest request = new BulkRequest();
        list.forEach(item -> request.add(new IndexRequest(idxName).id(item.getId())
                .source(item.getData(), XContentType.JSON)));
        restHighLevelClient.bulk(request, RequestOptions.DEFAULT);
    }


    /**
     * 分页搜索
     * @author xzr
     * @param idxName
     * @param builder
     * @param currPage
     * @param pageSize
     * @return
     * @throws IOException
     */
    public Page<Map<String, Object>> search(String idxName, SearchSourceBuilder builder, int currPage, int pageSize) throws IOException {
    	//设置分页
    	builder.from((currPage - 1) * pageSize);
    	builder.size(pageSize);
    	//设置搜索的超时时间
    	builder.timeout(new TimeValue(60, TimeUnit.SECONDS)); 
    	SearchRequest request = new SearchRequest(idxName);
        request.source(builder);
        SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
        SearchHit[] hits = response.getHits().getHits();
        
        int totalCount = (int) response.getHits().getTotalHits();
        List<Map<String, Object>> list = new ArrayList<>(hits.length);
        for (SearchHit hit : hits) {
            list.add(hit.getSourceAsMap());
        }
        return new Page<Map<String, Object>>(list, totalCount, pageSize, currPage);
    }
    
    /**
     * 高亮分页搜索显示
     * @author xzr
     * @param idxName
     * @param builder
     * @param currPage
     * @param pageSize
     * @return
     * @throws IOException
     */
    public Page<Map<String, Object>> search(String idxName, SearchSourceBuilder builder, int currPage, int pageSize, String... highLightFieldNames) throws IOException {
    	//设置分页
    	builder.from((currPage - 1) * pageSize);
    	builder.size(pageSize);
    	//设置搜索的超时时间
    	builder.timeout(new TimeValue(60, TimeUnit.SECONDS)); 
    	//设置高亮显示
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        //.field("*").requireFieldMatch(false);
        for(String field : highLightFieldNames) {
        	highlightBuilder.field(field).requireFieldMatch(true);
        }
        highlightBuilder.preTags("<font style=\"color:red\">");
        highlightBuilder.postTags("</font>");
        builder.highlighter(highlightBuilder);
 
        SearchRequest searchRequest = new SearchRequest(idxName);
        searchRequest.source(builder);
        //System.out.println("builder:" + builder);
        SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
 
        //遍历结果
        for(SearchHit hit : response.getHits()){
            Map<String, Object> source = hit.getSourceAsMap();
            //处理高亮片段
            Map<String, HighlightField> highlightFields = hit.getHighlightFields();
            for (String highLightFieldName : highLightFieldNames) {
            	HighlightField nameField = highlightFields.get(highLightFieldName);
                if(null != nameField){
                    Text[] fragments = nameField.fragments();
                    StringBuilder nameTmp = new StringBuilder();
                    for(Text text : fragments){
                        nameTmp.append(text);
                    }
                    //将高亮片段组装到结果中去
                    source.put(highLightFieldName, nameTmp.toString());
                }
            }
        }
        int totalCount = (int) response.getHits().getTotalHits();
        SearchHit[] hits = response.getHits().getHits();
        List<Map<String, Object>> list = new ArrayList<>(hits.length);
        for (SearchHit hit : hits) {
        	list.add(hit.getSourceAsMap());
        }
        return new Page<Map<String, Object>>(list, totalCount, pageSize, currPage);
    }


    /**
     * 分页搜索
     * @author xzr
     * @param idxName
     * @param builder
     * @param from
     * @param size
     * @return
     * @throws IOException
     */
    public Set<String> searchForSet(String idxName, SearchSourceBuilder builder, int from, int size) throws IOException {
        //设置分页
        builder.from(from);
        builder.size(size);
        SearchRequest request = new SearchRequest(idxName);
        request.source(builder);

        SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
        SearchHit[] hits = response.getHits().getHits();
        Set<String> hashSet=new LinkedHashSet<>();
        hashSet = Stream.of(hits)
                          .map(hit -> String.valueOf(hit.getSourceAsMap().get("id")))
                          .collect(Collectors.toSet());
        return hashSet;
    }

    public Set<String> searchForSet(String idxName, SearchSourceBuilder builder, int from, int size,String field) throws IOException {
        //设置分页
        builder.from(from);
        builder.size(size);
        SearchRequest request = new SearchRequest(idxName);
        request.source(builder);

        SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
        SearchHit[] hits = response.getHits().getHits();
        Set<String> hashSet=new LinkedHashSet<>();
        hashSet = Stream.of(hits)
                        .map(hit -> String.valueOf(hit.getSourceAsMap().get(field)))
                        .collect(Collectors.toSet());
        return hashSet;
    }

    /**
     * 不分页搜索
     * @param idxName
     * @param builder
     * @return
     * @throws IOException
     */
    public List<Map<String, Object>> search(String idxName, SearchSourceBuilder builder) throws IOException {
        //设置分页
        builder.from(1);
        //阿里云ES默认最大允许单次10000条
        builder.size(200000);
        //设置搜索的超时时间
        builder.timeout(new TimeValue(60, TimeUnit.SECONDS));
        SearchRequest request = new SearchRequest(idxName);
        request.source(builder);
        SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
        SearchHit[] hits = response.getHits().getHits();

        List<Map<String, Object>> list = new ArrayList<>(hits.length);
        for (SearchHit hit : hits) {
            list.add(hit.getSourceAsMap());
        }
        return list;
    }

    public String getScrollId(String idxName, SearchSourceBuilder builder, int size) throws IOException {
        builder.size(size);
        //设置搜索的超时时间
        builder.timeout(TimeValue.timeValueMinutes(5));
        SearchRequest request = new SearchRequest(idxName);
        request.scroll(new Scroll(TimeValue.timeValueMinutes(5)));
        request.source(builder);
        SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
        return response.getScrollId();
    }


    /**
     *@Description: 通过scrollId查询
     */
    public SearchResponse searchByScrollId(String scrollId) throws IOException {

        SearchScrollRequest searchScrollRequest = new SearchScrollRequest();
        searchScrollRequest.scrollId(scrollId);
        searchScrollRequest.scroll(TimeValue.timeValueMinutes(5));
        return restHighLevelClient.scroll(searchScrollRequest, RequestOptions.DEFAULT);

    }




    /**
     * @param idxName
     * @param builder
     */
    public Long searchCount(String idxName, SearchSourceBuilder builder) throws IOException {
        //设置搜索的超时时间
        CountRequest request = new CountRequest(idxName);
        request.source(builder);
        CountResponse response = restHighLevelClient.count(request, RequestOptions.DEFAULT);
        return response.getCount();
    }



    /**
     * 按字段分组搜索
     */
    public Set<String> searchForSetByGroup(String idxName, SearchSourceBuilder builder, String groupField) throws IOException {
        //设置分页
        builder.from(0);
        builder.size(1);
        //设置搜索的超时时间
        builder.timeout(new TimeValue(60, TimeUnit.SECONDS));
        SearchRequest request = new SearchRequest(idxName);
        request.source(builder);
        SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
        Aggregations agg = response.getAggregations();
        Terms terms = agg.get(groupField);
        Set<String> collect = terms.getBuckets().stream().map(bucket -> String.valueOf(bucket.getKey()))
                                   .collect(Collectors.toSet());
        return collect;
    }



    /** 删除index
     * @since
     */
    public void deleteIndex(String idxName) throws Exception {
        if (!this.indexExist(idxName)) {
            return;
        }
        restHighLevelClient.indices().delete(new DeleteIndexRequest(idxName), RequestOptions.DEFAULT);
    }


    /**
     * @throws
     * @since
     */
    public void deleteByQuery(String idxName, QueryBuilder builder) throws IOException {

        DeleteByQueryRequest request = new DeleteByQueryRequest(idxName);
        request.setQuery(builder);
        //设置批量操作数量,最大为10000
        request.setBatchSize(10000);
        request.setConflicts("proceed");
        restHighLevelClient.deleteByQuery(request, RequestOptions.DEFAULT);
    }
}

logstash同步数据到es:

input {
  jdbc {
	jdbc_driver_library => "E:\mysql-connector-java-5.1.46\mysql-connector-java-5.1.46\mysql-connector-java-5.1.46.jar"
	jdbc_driver_class => "com.mysql.jdbc.Driver"
    jdbc_connection_string => "数据库地址"
    jdbc_user => root
    jdbc_password => "密码"
	jdbc_paging_enabled => "true"
    jdbc_page_size => "3000"
	jdbc_default_timezone => "Asia/Shanghai"
    statement => "查询数据的sql"
    record_last_run => true
    tracking_column_type => "numeric"
    tracking_column => "update_time"
    use_column_value => true
    last_run_metadata_path => "D:\bid_last_id.txt"
  }
}

filter {
  mutate{
    copy => { "bid" => "[@metadata][_id]"}
    remove_field => ["@version","@timestamp"]
  }
}

output {
  elasticsearch {
    index => "jsk_search_bid"
    hosts => ["192.168.101.101:9200"]
	doc_as_upsert => true
    action => "update"
	document_id => "%{[@metadata][_id]}"
  }

}

备注:logstash同步数据不能同步嵌套对象的数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值