ElasticSearch

一、ElasticSearch

Elasticsearch是一个基于Apache Lucene库实现的,Restful风格的,分布式搜索和数据分析引擎。基于倒排索引技术,实现了高性能的全文检索和数据分析功能。

倒排索引:搜索速度快

1、安装ElasticSearch、Kibana、IK分词器

docker run -d \
  --name es \
  -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
  -e "discovery.type=single-node" \
  -v es-data:/usr/share/elasticsearch/data \
  -v es-plugins:/usr/share/elasticsearch/plugins \
  --privileged \
  --network fitzone\
  -p 9200:9200 \
  -p 9300:9300 \
  elasticsearch:7.12.1

docker run -d \
--name kibana \
-e ELASTICSEARCH_HOSTS=http://es:9200 \
--network=fitzone \
-p 5601:5601  \
kibana:7.12.1

docker exec -it es ./bin/elasticsearch-plugin  
install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.12.1.zip

2、Mapping映射属性

  • type:字段数据类型,常见的简单类型有:

    • 字符串:text(可分词的文本)、keyword(精确值)

    • 数值:longintegershortbytedoublefloat

    • 布尔:boolean

    • 日期:date

    • 对象:object

  • index:是否创建索引,默认为true

  • analyzer:使用哪种分词器

  • properties:该字段的子字段

3、索引库操作

①创建索引库

PUT /索引库名称
{
  "mappings": {
    "properties": {
      "字段名":{
        "type": "text",
        "analyzer": "ik_smart"
      },
      "字段名2":{
        "type": "keyword",
        "index": "false"
      },
      "字段名3":{
        "properties": {
          "子字段": {
            "type": "keyword"
          }
        }
      },
    }
  }
}

②修改索引库

PUT /索引库名/_mapping
{
  "properties": {
    "新字段名":{
      "type": "integer"
    }
  }
}

③查询索引库:GET /索引库名

④删除索引库:DELETE /索引库名

4、文档操作

①新增文档

POST /索引库名/_doc/文档id
{
    "字段1": "值1",
    "字段2": "值2",
    "字段3": {
        "子属性1": "值3",
        "子属性2": "值4"
    },
}

②全局修改文档

PUT /{索引库名}/_doc/文档id
{
    "字段1": "值1",
    "字段2": "值2",
}

③局部修改文档

POST /{索引库名}/_update/文档id
{
    "doc": {
         "字段名": "新的值",
    }
}

④查询文档:GET /索引库名/_doc/文档id

⑤删除文档:DELETE /索引库名/_doc/文档id

5、RestClient操作

初始化RestClient

//导依赖
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>

//指定版本
  <properties>
      <maven.compiler.source>8</maven.compiler.source>
      <maven.compiler.target>8</maven.compiler.target>
      <elasticsearch.version>7.12.1</elasticsearch.version>
  </properties>

@Bean
public RestHighLevelClient highLevelClient(){
    return new RestHighLevelClient(RestClient.builder(
         HttpHost.create("http://islunatic.icu:9200")
    ));
}

6、数据导入es

    @Autowired
    private ActivityService activityService;

    @Autowired
    private RestHighLevelClient client;

    @Test
    public void testA() throws IOException {
        List<Activity> list = activityService.list();
        //数据导入
        BulkRequest bulkRequest = new BulkRequest("activity");
        for (Activity activity : list) {
            IndexRequest indexRequest = new IndexRequest();
            indexRequest.id(activity.getId().toString()).source(JSON.toJSONString(activity),XContentType.JSON);
            //批量添加数据
            bulkRequest.add(indexRequest);
        }
        client.bulk(bulkRequest,RequestOptions.DEFAULT);
    }

7、查询操作

//获取request
SearchRequest request = new SearchRequest("activity");
//DSL语句
Integer limit = activityPageDTO.getLimit();
Integer page = activityPageDTO.getPage();
//分页查询、高亮显示、排序操作
request.source().from(page)
                .size(limit)
                .query(QueryBuilders.matchAllQuery())
                .sort("createTime", SortOrder.ASC)
                .highlighter(SearchSourceBuilder.highlight()
                        .field("cover")
                        .preTags("<em>")
                        .postTags("</em>"));
SearchResponse search = client.search(request, RequestOptions.DEFAULT);
//解析响应
return handleResponse(search);

//解析数据 
 private Page<Activity> handleResponse(SearchResponse response) {
     SearchHits searchHits = response.getHits();
     // 1.获取总条数
     long total = searchHits.getTotalHits().value;
     System.out.println("共搜索到" + total + "条数据");
     // 2.遍历结果数组
     SearchHit[] hits = searchHits.getHits();
     for (SearchHit hit : hits) {
        // 3.得到_source,也就是原始json文档
        String source = hit.getSourceAsString();
        // 4.反序列化并打印
        JSON.parseObject(source, Activity.class);
    }
     return null;
}
相关推荐
Francek Chen19 分钟前
【大数据技术基础 | 实验十二】Hive实验:Hive分区
大数据·数据仓库·hive·hadoop·分布式
Natural_yz3 小时前
大数据学习17之Spark-Core
大数据·学习·spark
Karoku0664 小时前
【企业级分布式系统】ELK优化
运维·服务器·数据库·elk·elasticsearch
莫叫石榴姐4 小时前
数据科学与SQL:组距分组分析 | 区间分布问题
大数据·人工智能·sql·深度学习·算法·机器学习·数据挖掘
魔珐科技6 小时前
以3D数字人AI产品赋能教育培训人才发展,魔珐科技亮相AI+教育创新与人才发展大会
大数据·人工智能
上优6 小时前
uniapp 选择 省市区 省市 以及 回显
大数据·elasticsearch·uni-app
samLi06207 小时前
【更新】中国省级产业集聚测算数据及协调集聚指数数据(2000-2022年)
大数据
Mephisto.java7 小时前
【大数据学习 | Spark-Core】Spark提交及运行流程
大数据·学习·spark
EasyCVR8 小时前
私有化部署视频平台EasyCVR宇视设备视频平台如何构建视频联网平台及升级视频转码业务?
大数据·网络·音视频·h.265
hummhumm8 小时前
第 22 章 - Go语言 测试与基准测试
java·大数据·开发语言·前端·python·golang·log4j