当前位置:   article > 正文

ElasticSearch全文搜索引擎基础入门

elasticsearch全文搜索引擎基础入门

一、ES的介绍

1、ES概述

ES是一个使用Java语言并且基于Lucene编写的搜索引擎框架,他提供了分布式的全文搜索功能,提供了一个统一的基于RESTful风格的WEB接口,官方客户端也对多种语言都提供了相应的API。
Lucene:Lucene本身就是一个搜索引擎的底层。
分布式:ES主要是为了突出他的横向扩展能力。
全文检索:将一段词语进行分词,并且将分出的单个词语统一的放到一个分词库中,在搜索时,根据关键字去分词库中检索,找到匹配的内容。(倒排索引)
RESTful风格的WEB接口:操作ES很简单,只需要发送一个HTTP请求,并且根据请求方式的不同,携带参数的同,执行相应的功能。
应用广泛:Github.com,WIKI,Gold Man用ES每天维护将近10TB的数据。

2、ES由来

在这里插入图片描述

3、ES和Solr

Solr在查询死数据时,速度相对ES更快一些。但是数据如果是实时改变的,Solr的查询速度会降低很多,ES的查询的效率基本没有变化。

Solr搭建基于需要依赖Zookeeper来帮助管理。ES本身就支持集群的搭建,不需要第三方的介入。

最开始Solr的社区可以说是非常火爆,针对国内的文档并不是很多。在ES出现之后,ES的社区火爆程度直线上升,ES的文档非常健全。

ES对现在云计算和大数据支持的特别好。

4、倒排索引

将存放的数据,以一定的方式进行分词,并且将分词的内容存放到一个单独的分词库中。
当用户去查询数据时,会将用户的查询关键字进行分词,然后去分词库中匹配内容,最终得到数据的id标识,根据id标识去存放数据的位置拉取到指定的数据。
在这里插入图片描述

二、下载安装

1、下载和安装elasticsearch

官网下载:https://www.elastic.co/cn/downloads/past-releases#elasticsearch
github下载:https://github.com/elastic/elasticsearch/tags

windows版本解压后,打开bin目录,双击elasticsearch.bat启动
在这里插入图片描述

2、下载安装Kibana

Kibana主要是通过页面的方式来监控es,默认监控的ip是localhost,端口是9200,如果es的地址改变了,需要修改config文件夹中的kibana.yml配置文件,修改elasticsearch.url属性。
官网下载:https://www.elastic.co/cn/downloads/past-releases#kibana
github下载:https://github.com/elastic/kibana/tags

还是在刚刚的下载地址,下拉框选择kibana,版本还是选择6.5.4 windows版本下载解压后,打开bin目录,启动kibana.bat
在浏览器输入http://localhost:5601
在这里插入图片描述

3、安装logstash

Logstash 是免费且开放的服务器端数据处理管道,能够从多个来源采集数据,转换数据,然后将数据发送到“存储库”中。这里主要用来将MySQL中的数据库导入到ES中。
官网下载:https://www.elastic.co/cn/downloads/past-releases#logstash
github下载:https://github.com/elastic/logstash/tags
还是在刚刚下载的网站,找到logstash,选择6.5.4版本,下载即可。

4、安装IK分词器

分词器:将搜索的关键词进行拆分
默认分词器Analyzer,对中文不友好

analyzer logical name description
standard analyzer standard standard tokenizer, standard filter, lower case filter, stop filter
simple analyzer simple lower case tokenizer
stop analyzer stop lower case tokenizer, stop filter
keyword analyzer keyword 不分词,内容整体作为一个token(not_analyzed)
pattern analyzer whitespace 正则表达式分词,默认匹配\W+
language analyzers lang 各种语言
snowball analyzer snowball standard tokenizer, standard filter, lower case filter, stop filter, snowball filter
custom custom 至少需要指定一个 Tokenizer, 零个或多个Token Filter, 零个或多

在这里插入图片描述

下载IK分词器的地址:https://github.com/medcl/elasticsearch-analysis-ik/tags
windows版本:
将其解压放在ES的安装目录下的 /plugins/ik 目录下,重启es,分词器插件就自动加载了。

Linux版本:
进去到ES容器内部,跳转到bin目录下,执行bin目录下的脚本文件:

./elasticsearch-plugin install http://tomcat01.qfjava.cn:81/elasticsearch-analysis-ik-6.5.4.zip
  • 1

重启ES的容器,让IK分词器生效。
注意:ik的中文分词器为:ik_max_word
在这里插入图片描述

四、 ElasticSearch基本操作

1、ES的结构

索引Index,分片和备份

  • ES的服务中,可以创建多个索引。
  • 每一个索引默认被分成5片存储。
  • 每一个分片都会存在至少一个备份分片。
  • 备份分片默认不会帮助检索数据,当ES检索压力特别大的时候,备份分片才会帮助检索数据。
  • 备份的分片必须放在不同的服务器中。
    在这里插入图片描述

类型 Type

一个索引下,可以创建多个类型。
Ps:根据版本不同,类型的创建也不同。
在这里插入图片描述

文档 Doc

一个类型下,可以有多个文档。这个文档就类似于MySQL表中的多行数据。
在这里插入图片描述
属性 Field
一个文档中,可以包含多个属性。类似于MySQL表中的一行数据存在多个列。

在这里插入图片描述

2、操作ES的RESTful语法

GET请求

  • http://ip:port/index:查询索引信息
  • http://ip:port/index/type/doc_id:查询指定的文档信息

POST请求

  • http://ip:port/index/type/_search:查询文档,可以在请求体中添加json字符串来代表查询条件
  • http://ip:port/index/type/doc_id/_update:修改文档,在请求体中指定json字符串代表修改的具体信息

PUT请求

  • http://ip:port/index:创建一个索引,需要在请求体中指定索引的信息,类型,结构
  • http://ip:port/index/type/_mappings:代表创建索引时,指定索引文档存储的属性的信息

DELETE请求

  • http://ip:port/index:删除索引
  • http://ip:port/index/type/doc_id:删除指定的文档

3、索引的操作

创建一个索引

PUT /person
{
  "settings": {
    "number_of_shards": 5
    , "number_of_replicas": 1
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

查看索引信息
语法:

GET /person
  • 1

管理页查看
在这里插入图片描述
删除索引

DELETE /person
  • 1

4、ES中Field可以指定的类型

字符串类型

  • text:被用于全文检索。 将当前Field进行分词。
  • keyword:当前Field不会被分词。

数值类型

  • long:取值范围为-9223372036854774808~922337203685477480(-2的63次方到2的63次 方-1),占用8个字节
  • integer:取值范围为-2147483648~2147483647(-2的31次方到2的31次方-1),占用4个字节
  • short:取值范围为-32768~32767(-2的15次方到2的15次方-1),占用2个字节
  • byte:取值范围为-128~127(-2的7次方到2的7次方-1),占用1个字节
  • double:1.797693e+308~ 4.9000000e-324 (e+308表示是乘以10的308次方,e-324表示乘以10的负324次方)占用8个字节
  • float:3.402823e+38 ~ 1.401298e-45(e+38表示是乘以10的38次方,e-45表示乘以10的负45次方),占用4个字节
  • half_float:精度比float小一半。
  • scaled_float:根据一个long和scaled来表达一个浮点型,long-345,scaled-100 -> 3.45

时间类型

  • date:针对时间类型指定具体的格式

布尔类型

  • boolean:表达true和false

二进制类型

  • binary类型暂时支持Base64 encode string

范围类型

  • long_range:赋值时,无需指定具体的内容,只需要存储一个范围即可,指定gt,lt, gte,lte integer_range:同上
  • double_range:同上
  • float_range:同上
  • date_range:同上
  • ip_range:同上

经纬度类型

  • geo_point:用来存储经纬度的

ip类型

  • ip:可以存储IPV4或者IPV6

其他的数据类型参考官网: https://www.elastic.co/guide/en/elasticsearch/reference/6.5/mapping-types.html

5、创建索引并指定数据结构

语法如下:

# 创建索引
PUT /book
{
  "settings": {
  # 主分片数
    "number_of_shards": 5
    # 备分片数
    , "number_of_replicas": 1
  },
  # 指定数据结构
  "mappings": {
  # 类型Type
    "novel":{
    # 文档存储的field
      "properties":{
      # Filed属性名
        "name":{
        # 类型
          "type":"text",
          # 指定分词器
          "analyzer":"ik_max_word",
          # 指定当前的Field可以被作为查询的条件
          "index":true,
          # 是否需要额外存储
          "store":false
        },
        "author":{
          "type":"keyword"
        },
        "count":{
          "type":"long"
        },
        "on-sale":{
          "type":"date",
          # 时间类型格式化方式
          "format":"yyyy-MM-dd HH-mm-ss"
        },
        "desc":{
          "type":"text",
          "analyzer":"ik_max_word"
        }
      }
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

6、文档的操作

文档在ES服务中的唯一标识, _index_type_id 三个内容为组合,锁定一个文档,操作是添加还是修改。

新建文档

自动生成_id

POST /book/novel
{
  "name":"盘龙",
  "author":"我吃西红柿",
  "count":10000,
  "on-sale":"2000-01-01 00-00-00",
  "desc":"山重水复疑无路,柳暗花明又一村!"
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

手动指定_id

# 添加文档,手动指定id
PUT /book/novel/1
{
  "name":"红楼梦",
  "author":"曹雪芹",
  "count":100000,
  "on-sale":"1935-01-01 00-00-00",
  "desc":"一个是阆苑仙葩,一个是美玉无瑕"
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

修改文档

覆盖式修改

PUT /book/novel/1
{
  "name":"红楼梦",
  "author":"曹雪芹",
  "count":222222,
  "on-sale":"1935-01-01 00-00-00",
  "desc":"一个是阆苑仙葩,一个是美玉无瑕"
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

doc修改方式

#修改文档,基于doc方式
POST /book/novel/1/_update
{
  "doc": {
  # 指定需要修改的field和对应的值
    "count":333333
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

删除文档

根据id删除

DELETE /book/novel/id
  • 1

五、Java操作ElasticSearch

1、Java连接ES

1)、创建maven工程
2)、引入依赖

        <!--elasticsearch-->
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>6.5.4</version>
        </dependency>
        <!--elasticsearch高级API-->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>6.5.4</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
        </dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

3)、创建ES连接

public class ESClient {
   
    //客户端连接对象
    public static RestHighLevelClient getClient(){
   
        //创建HttpHost对象,配置主机信息,ip和端口
        HttpHost host = new HttpHost("localhost", 9200);
        //创建RestClientBuilder客户端连接对象构造者
        RestClientBuilder clientBuilder = RestClient.builder(host);
        //创建RestHighLevelClient客户端连接对象
        RestHighLevelClient client = new RestHighLevelClient(clientBuilder);
        return client;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

2、java操作索引

创建索引

public class TestES {
   
    //获取客户端连接对象
    RestHighLevelClient client = ESClient.getClient();
    //索引名和类型
    String index = "person";
    String type = "man";
    @Test
    public void createIndex() {
   
        //准备索引的setting
        Settings.Builder settings = Settings.builder()
                .put("number_of_shards", 5)
                .put("number_of_replicas", 1);
        //准备索引的mapping
        try {
   
            XContentBuilder mappings = JsonXContent.contentBuilder()
                    .startObject()//mapping类型
                        .startObject("properties")
                            .startObject("name")
                                .field("type", "text")
                            .endObject()
                            .startObject("age")
                                .field("type", "integer")
                            .endObject()
                            .startObject("birthday")
                                .field("type", "date")
                                .field("format", "yy-MM-dd")
                            .endObject()
                        .endObject()
                    .endObject();
            //将mapping和setting封装成request对象
            CreateIndexRequest request = new CreateIndexRequest(index)
                    .settings(settings)
                    .mapping(type,mappings);
            //通过client对象去连接es并发送一个创建索引的请求执行创建索引
            CreateIndexResponse resp = client.indices().create(request, RequestOptions.DEFAULT);//RequestOptions.DEFAULT默认请求选项
            System.out.println("resp"+resp.toString());
        } catch (IOException e) {
   
            e.printStackTrace();
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

检查索引是否存在

    //检查索引
    @Test
    public void existsIndex(){
   
        //1、准备request对象
        GetIndexRequest request = new GetIndexRequest();
        request.indices(index);

        //client查询
        boolean exists = false;
        try {
   
            exists = client.indices().exists(request, RequestOptions.DEFAULT);
        } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/862337
推荐阅读
相关标签
  

闽ICP备14008679号