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;
}
相关推荐
jianghx10242 小时前
Docker部署ES,开启安全认证并且设置账号密码(已运行中)
安全·elasticsearch·docker·es账号密码设置
IT小哥哥呀2 小时前
电池制造行业数字化实施
大数据·制造·智能制造·数字化·mom·电池·信息化
Xi xi xi2 小时前
苏州唯理科技近期也正式发布了国内首款神经腕带产品
大数据·人工智能·经验分享·科技
yumgpkpm3 小时前
华为鲲鹏 Aarch64 环境下多 Oracle 、mysql数据库汇聚到Cloudera CDP7.3操作指南
大数据·数据库·mysql·华为·oracle·kafka·cloudera
UMI赋能企业4 小时前
制造业流程自动化提升生产力的全面分析
大数据·人工智能
TDengine (老段)4 小时前
TDengine 数学函数 FLOOR 用户手册
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
派可数据BI可视化7 小时前
商业智能BI 浅谈数据孤岛和数据分析的发展
大数据·数据库·数据仓库·信息可视化·数据挖掘·数据分析
jiedaodezhuti7 小时前
Flink性能调优基石:资源配置与内存优化实践
大数据·flink
阿里云大数据AI技术8 小时前
云栖实录 | AI 搜索智能探索:揭秘如何让搜索“有大脑”
人工智能·搜索引擎
Lx3528 小时前
Flink窗口机制详解:如何处理无界数据流
大数据