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;
}
相关推荐
智购科技自动贩卖机1 小时前
自动售货机嵌入式状态机设计实战:从45个事件源到层次型状态机的工程重构
大数据·人工智能·stm32·物联网·重构·硬件架构
乐迪信息1 小时前
智慧港口船舶AI算法实现在线状态监测
大数据·人工智能·深度学习·算法·计算机视觉
Raas1001 小时前
MAI Gateway(魔芋企业级AI网关)对比分析:AI网关和API网关区别?企业级能力差距一览
大数据·人工智能·数据挖掘·mai gateway·企业级产品
Neighbor_OldY2 小时前
云上安全配置审计与误配置修复实战:从安全组、OSS、RAM到数据库的全栈排查复盘
大数据·运维·安全·云计算
瑞码空间3 小时前
git知识点黄金笔记
笔记·git·elasticsearch
工业甲酰苯胺3 小时前
AI低代码破局:制造业数智转型落地实战
大数据·人工智能·低代码·制造
大大大大晴天4 小时前
每天认识一个组件:流式存储Apache Fluss
大数据
熊野君4 小时前
第 4 章 技术产品经理核心能力模型
大数据·人工智能·产品经理
财复视界4 小时前
光智科技从“光学元件”到“稀散金属材料平台”的进化逻辑
大数据·人工智能·科技
牛企老板俱乐部5 小时前
2026年珠海精锐增材智造金属小批量交付可提供SGS与RoHS材质证明
大数据