ElasticSearch

目录结构

  bin :启动文件

  config:配置文件

    log4j2 :日志配置文件

    jvm.options  java 虚拟机相关配置

    elasticSerch.yml    elasticSerch的配置文件 默认端口9200 

  lib:相关jar包

  logs: 日志

  modules:功能模块

  pulgins:插件(ik)

 

 

1.安装es ,进入bin目录 双击运行elasticsearch.bat

  浏览器地址输入:http://localhost:9200

2.安装图形化工具 head (前提必须安装node.js环境)

  安装npm install

  进入head目录,cmd 执行启动命令:npm run start

  浏览器地址输入:http://localhost:9100

3.连接head 时存在跨域问题,需要爱es配置文件中(config/elasticSerch.yml )配置跨域属性值

  http.cors.enabled: true
  http.cors.allow-origin: "*"

4.了解ELK

  ELK是Elasticsearch、Logstash、Kibana三大开源框架首字母大写简称。市面上也被成为Elastic Stack。其中Elasticsearch是一个基于Lucene、分布式、通过Restful方式进行交互的近实时搜索平台框 架。像类似百度、谷歌这种大数据全文搜索引擎的场景都可以使用Elasticsearch作为底层支持框架,可 见Elasticsearch提供的搜索能力确实强大,市面上很多时候我们简称Elasticsearch为es。Logstash是ELK 的中央数据流引擎,用于从不同目标(文件/数据存储/MQ)收集的不同格式数据,经过过滤后支持输出 到不同目的地(文  件/MQ/redis/elasticsearch/kafka等)。Kibana可以将elasticsearch的数据通过友好 的页面展示出来,提供实时分析的功能。
市面上很多开发只要提到ELK能够一致说出它是一个日志分析架构技术栈总称,但实际上ELK不仅仅适用 于日志分析,它还可以支持其它任何数据分析和收集的场景,日志分析和收集只是更具有代表性。并非 唯一性。

 

 

 


 
5.安装Kibana

  Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索 引中的数据。使用Kibana,可以通过各种图表进行高级数据分析及展示。Kibana让海量数据更容易理 解。它操作简单,基于浏览器的用户界面可以快速创建仪表板(dashboard)实时显示Elasticsearch查 询动态。设置Kibana非常简单。无需编码或者额外的基础架构,几分钟内就可以完成Kibana安装并启动 Elasticsearch索引监测。 官网:https://www.elastic.co/cn/kibana
Kibana 版本要和 Es 一致!

 

 

 

进步bin目录执行kibana.bat运行

访问地址:http://localhost:5601

设置成中文的,在kibana 安装的目录下的config文件中的kibana.yml文件中设置

#i18n.locale: " ch-ZN"

 

ES

 

集群,节点,索引,类型,文档,映射

字段类型(mapping)中对于字段的定义称为映射, 比如 name 映射为字符串类型。 

 

安装ik分词器

有两种分词

1.ik_smart   :为最小切分

2.ik_max_word :为最细粒度切分

 

 

 

基于restFul风格命令

 

 

 创建索引

PUT /test1/type1/1
{
  "name": "苦瓜先森",
  "age": 22
}

第一种情况

1.创建索引字段规则 注意没有写属性,默认属性是_doc(PUT /test2/_doc)

PUT /test2
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "age": {
        "type": "long"
      },
      "birthday": {
        "type": "date"
      }
    }
  }
}

新建对应规则的文档**类型名称必须为_doc,字段类型必须对应

put /test2/_doc/1
{
  "name": "中国人名",
  "age": 12,
  "birthday": "2020-12-21"
}

第二种情况

创建指定type类型规则 ElasticSearch7.x版本废弃这种写法了,ElasticSearch6.x支持

PUT /test3
{
  "mappings": {
    "test": {
      "properties": {
        "name": {
          "type": "text"
        },
        "age": {
          "type": "long"
        },
        "birthday": {
          "type": "date"
        }
      }
    }
  }
}

 

修改 

第一种方式

PUT /test2/_doc/1
{
  "name": "苦瓜先森11",
  "age": 22,
  "birthday": "2020-08-06"
}

第二种方式

POSt /test2/_doc/1/_update
{
  "doc": {
    "age": 99
  }
}

 在原有的类型中添加新的字段  put   /索引/_mapping/类型

PUT mprm/_mapping/mprm
{
  "properties": {
    "customerNo": {
      "type": "text",
      "fields": {
        "raw": {
          "type": "keyword"
        }
      },
      "fielddata": true
    }
  }
}

 

 

查询

 

package com.tjetc.myspringboot;

import com.alibaba.fastjson.JSON;
import com.tjetc.myspringboot.bean.User;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;

@SpringBootTest
class SpringbootSecurityApplicationTests {

    //方式一
    @Autowired
    @Qualifier("restHighLevelClient")
    private RestHighLevelClient client;

    @Test
    void creatIndexRequest() throws IOException {
        //创建索引请求
        CreateIndexRequest request = new CreateIndexRequest("fanlj_index");
        //客户端执行请求
        CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);
        //返回创建的索引名称
        String index = createIndexResponse.index();
        System.out.println(index);
    }


    /**
     *索引是否存在
     */
    @Test
    void exitisIndexRequest() throws IOException {
        System.out.println(123);
        //创建索引请求
        GetIndexRequest getRequest = new GetIndexRequest("fanlj_index");
        //客户端执行请求
        boolean exists = client.indices().exists(getRequest, RequestOptions.DEFAULT);
        System.out.println(exists);
    }

    /**
     * 添加一条文档
     * @throws IOException
     */
    @Test
    void createIndex() throws IOException {
        Date date = new Date(1998,8,6);
        //创建索引请求
        User user = new User("苦瓜先生", 18, "男", date,"玩","IT");
        // 创建请求
        IndexRequest request = new IndexRequest("fanlj_index");
        // 设置请求文档id
        request.id("2");
        // 请求超时时间1秒
        request.timeout("1s");
        // 将我们的数据放入请求中 json格式
        request.source(JSON.toJSONString(user),XContentType.JSON );

        // 客户端发送请求,返回响应结果
        IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);
        System.out.println(indexResponse.toString());
        // 返回请求状态
        System.out.println(indexResponse.status());
    }


    /**
     *获取文档
     */
    @Test
    void getIndexRequset() throws IOException {
        // 获取索引请求
        GetIndexRequest getIndexRequest = new GetIndexRequest("fanlj_index");
        // 索引请求是否存在
        boolean exists = client.indices().exists(getIndexRequest, RequestOptions.DEFAULT);
        if(exists){
            // 获取文档
            GetRequest request = new GetRequest("fanlj_index", "1");
            // 客户端发送请求
            boolean exists1 = client.exists(request, RequestOptions.DEFAULT);
            System.out.println(exists1);

        }
    }

    /**
     *获取文档信息
     */
    @Test
    void getIndexRequsetDoc() throws IOException {
        // 获取索引请求
        GetIndexRequest getIndexRequest = new GetIndexRequest("fanlj_index");
        // 索引请求是否存在
        boolean exists = client.indices().exists(getIndexRequest, RequestOptions.DEFAULT);
        if(exists){
            // 获取文档
            GetRequest request = new GetRequest("fanlj_index", "1");
            boolean requestExists = client.exists(request, RequestOptions.DEFAULT);
            if (requestExists) {
                // 客户端发起获取请求 返回响应
                GetResponse getResponse = client.get(request, RequestOptions.DEFAULT);
                //返回的结果
                System.out.println(getResponse.getSourceAsString());
                System.out.println(getResponse);

            }

        }
    }

    /**
     *更新文档信息
     */
    @Test
    void updateIndexRequsetDoc() throws IOException, ParseException {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date date = simpleDateFormat.parse("1998-08-06");
        // 修改文档
        UpdateRequest updateRequest = new UpdateRequest("fanlj_index", "1");
        updateRequest.timeout("1s");
        User user = new User("苦瓜先生", 18, "男", date,"乐","java");
        updateRequest.doc(JSON.toJSONString(user), XContentType.JSON);
        UpdateResponse update = client.update(updateRequest, RequestOptions.DEFAULT);
        System.out.println(update.status());
    }


    /**
     *更新文档信息
     */
    @Test
    void deleteIndexRequsetDoc() throws IOException, ParseException {
        // 删除文档
        DeleteRequest deleteRequest = new DeleteRequest("fanlj_index", "1");
        DeleteResponse delete = client.delete(deleteRequest, RequestOptions.DEFAULT);
        System.out.println(delete.status());


    }


    /**
     *批量插入文档
     */
    @Test
    void batchIndexRequsetDoc() throws IOException, ParseException {

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date date = simpleDateFormat.parse("1998-08-06");
        BulkRequest bulkRequest = new BulkRequest();
        bulkRequest.timeout("10s");

        List<User> userList = new ArrayList<>();
        userList.add(new User("sb", 18, "男", date,"乐","java"));
        userList.add(new User("sb", 18, "男", date,"乐","java"));
        userList.add(new User("sb", 18, "男", date,"乐","java"));
        userList.add(new User("sb", 18, "男", date,"乐","java"));
        userList.add(new User("sb", 18, "男", date,"乐","java"));

        for (int i = 0; i < userList.size(); i++) {
            bulkRequest.add(new IndexRequest("fanlj_index")
                    .id("" + (i + 1))
                    .source(JSON.toJSONString(userList.get(i)), XContentType.JSON));
        }

        BulkResponse bulk = client.bulk(bulkRequest, RequestOptions.DEFAULT);
        System.out.println(bulk.buildFailureMessage());
        System.out.println(bulk.status());
        System.out.println(bulk.hasFailures());
    }



    /**
     *搜索
     */
    @Test
    void searchIndexRequsetDoc() throws IOException, ParseException {

        // 搜索请求
        SearchRequest searchRequest = new SearchRequest("fanlj_index");
        // 构建搜索器
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        // 查询条件
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "sb");

        sourceBuilder.query(termQueryBuilder);
        sourceBuilder.timeout(new TimeValue(60,TimeUnit.SECONDS));
        searchRequest.source(sourceBuilder);

        SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
        System.err.println(JSON.toJSONString(search.getHits()));

        for (SearchHit documentFields : search.getHits().getHits()) {
            System.err.println(documentFields.getSourceAsMap());
        }

    }
}

  

 

复合查询

 

posted @ 2020-06-22 22:02  苦瓜先森  阅读(206)  评论(0编辑  收藏  举报