Elasticsearch学习笔记(一)

一.什么是Elasticsearch?

         ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于[云计算]中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

        ElaticSearch,简称为es, es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。es也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。

ElaticSearch相当于数据库,但只存储JSON数据。       

二. ElaticSearch解决什么问题?

1.传统的方式进行搜索的时候速度慢
2.搜索的精度不高

解决办法:

通过倒排索引结构来实现。(1.建立倒排的流程 2.根据倒排查询数据流程)
传统的方式: 先找文档,再找内容 再匹配 速度慢
倒排索引:通过词找文档 直接找数据,速度快。

三.ElasticSearch安装与启动

ElasticSearch的官方地址: https://www.elastic.co/products/elasticsearch

Window版的ElasticSearch的安装很简单,解压开即安装完毕,解压后的ElasticSearch的目录结构如下:

启动:

注意:

9300是TCP通讯端口,集群间和TCPClient都执行该端口,可供Java程序调用;

9200是http协议的RESTful接口 。

通过浏览器访问ElasticSearch服务器,看到如下返回的json信息,代表服务启动成功:

 

安装ES的图形化界面插件 :

ElasticSearch不同于Solr自带图形化界面,我们可以通过安装ElasticSearch的head插件,完成图形化界面的效果,完成索引数据的查看。

四.基本概念

索引  index       ---> 数据库的库

类型  type		---> 数据库的表 (已废弃)

文档  document	---> 数据库的表中的行

字段  Field		---> 数据库中的行的列

映射  Mapping     ---> 列的限制(约束)

Field中有四个重要的属性:数据类型,是否分词 是否存储 是否索引. 类似于指定数据库中的表中的列的一些约束,需要根据不同的应用场景来决定使用哪种数据类型和属性值。
+ 数据类型 :定义了该Field的数据存储的方式 有基本数据类型 和 字符串类型以及 复杂的数据类型
+ 是否分词 :定义了该字段的值是否要被索引。分词的目的就是为了要索引

(分词就是切词的过程叫分词)
+ 是否索引 :定义了该字段是否要被搜索  要索引的目的就是为了要搜索
+ 是否存储 :定义了是否该存储该数据到底层的lucene中.默认是不存储的。存储不存储看页面是否需要展示

接近实时 NRT(near real time)

Elasticsearch是一个接近实时的搜索平台。这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是1秒以内)

  集群 cluster

一个集群就是由一个或多个节点组织在一起,它们共同持有整个的数据,并一起提供索引和搜索功能。

节点 node

一个节点是集群中的一个服务器,作为集群的一部分,它存储数据,参与集群的索引和搜索功能。

 操作ElasticSearch

java api 使用 spring data elasticsearch

五.实操 搭建ElasticSearch操作环境 

创建一个springboot工程,注意添加springboot 的spring data elasticsearch的起步依赖,我们使用该起步依赖中的transport-elasticsearch的官方的API

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.4.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

创建启动类和配置连接服务器地址

@SpringBootApplication
public class ESApplication {
    public static void main(String[] args) {
        SpringApplication.run(ESApplication.class, args);
    }
}

yml文件

server:
  port: 8080
spring:
  data:
    elasticsearch:
      cluster-nodes: 127.0.0.1:9300
      cluster-name: elasticsearch

六.操作ElasticSearch

新建索引+添加文档

创建实体对象用于存储数据转成JSON

@Data
public class Article implements Serializable {
    private Long id;
    private String content;
    private String title;
}
@SpringBootTest
@RunWith(SpringRunner.class)
public class EsTest {

    @Autowired
    private TransportClient transportClient;//操作链接到es服务端的客户端API
    @Autowired
    private ObjectMapper objectMapper;//json的转换器

    //insert  //update

    //创建索引  创建类型  创建文档  能自动的进行映射  ( blog01,article类型,docuemnt数据(JSON))

    /**
     * {
     * "id":1,
     * "title":"十九届六中全会标题"
     * "content":"细读十九届六中全会精神内容"
     * <p>
     * }
     */
    @Test
    public void create() throws Exception {

        //restTemplate

        Article article = new Article(1L, "十九届六中全会标题", "细读十九届六中全会精神内容");

        String jsonstr = objectMapper.writeValueAsString(article);
        //参数1 指定索引名
        //参数2 指定类型名称
        //参数3 指定文档的唯一标识
        IndexResponse indexResponse = transportClient.prepareIndex("blog01", "article", "1")
                //参数1 指定文档的数据是一个JSON字符串
                //参数2 指定数据类型 JSON数据类型
                .setSource(jsonstr, XContentType.JSON)
                //指定动作 将数据存储到es服务器中
                .get();
        System.out.println(indexResponse.getIndex() + ":" + indexResponse.getVersion() + ":" + indexResponse.getType());
    }

    //update


    //delete
    @Test
    public void delete() {
        //删除文档ID为1的数据
        transportClient.prepareDelete("blog01", "article", "1").get();
    }


    //select 数据

    @Test
    public void select() {
        GetResponse docuemntResponse = transportClient.prepareGet("blog01", "article", "1").get();
        Map<String, Object> sourceAsMap = docuemntResponse.getSourceAsMap();
        String sourceAsString = docuemntResponse.getSourceAsString();
        System.out.println(sourceAsMap);
        System.out.println(sourceAsString);
    }

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值