欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

全文检索

程序员文章站 2022-07-01 09:44:21
...

数据总体分为两种:结构化数据和非结构化数据。

  • 结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等。
    数据库这些直接进行sql语句进行查询,很快就能得到结果
  • 非结构化数据:指不定长或无固定格式的数据,如邮件,word 文档等磁盘上 的文件 ,
    非结构化数据则有俩种,顺序扫描法(从头找到尾)、全文检索 (非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有 一定结构的数据进行搜索)

Lucene

Lucene 是一个高效的,采用倒排文件索引结构 ,基于Java 的全文检索库。

Elastic

Elastic有一条完整的产品线:Elasticsearch、Kibana、Logstash等,前面说的三个就是大家常说的ELK技术栈。

ElasticSearch(全文检索库)

底层用的是Lucene实现的,本质也是存储数据,很多概念与MySQL类似的。
详细说明:  
概念 说明
索引库 (indices) indices是index的复数,代表许多的索引,
类型(type) 类型是模拟mysql中的table概念,一个索引库下可以有不同类型的索引,类似 数据库中的表概念。数据库表中有表结构,也就是表中每个字段的约束信息; 索引库的类型中对应表结构的叫做 映射(mapping) ,用来定义每个字段的约 束。
文档 (document) 存入索引库原始的数据。比如每一条商品信息,就是一个文档
字段(field) 文档中的属性
映射配置 (mappings) 字段的数据类型、属性、是否索引、是否存储等特性

创建索引的请求格式:

  • 请求方式:PUT

  • 请求路径:索引库名

  • 请求参数:json格式:

    {
        "settings": {
        "属性名": "属性值"
        }
    }
    

    settings:就是索引库设置,其中可以定义索引库的各种属性,目前我们可以不设置,都走默认。

这里会有红色提示,7.0之前默认会创建5个shared,7.0开始之后创建一个shard,可以在创建索引时加上setting:

PUT itheima1
{
  "settings": {
    "number_of_shards": 5
  }
}

可以指定shards为1

PUT itheima2
{
  "settings": {
    "number_of_shards": 1
  }
}

通过Head可以看到索引信息

查看索引库

语法

GET 索引库名  

调用示例:

GET itheima
GET itheima?include_type_name=false

删除索引库

语法

DELETE 索引库名

调用示例:

DELETE itheima

再次查看itheima:

也可以用HEAD请求,查看索引是否存在:

3.6 操作类型及映射

有了 索引库 ,等于有了数据库中的 database 。接下来就需要索引库中的 类型 了,也就是数据库中的
表 。创建数据库表需要设置字段约束,索引库也一样,在创建索引库的类型时,需要知道这个类型下
有哪些字段,每个字段有哪些约束信息,这就叫做 字段映射(mapping)
字段的约束我们在学习Lucene中我们都见到过,包括到不限于:

  • 字段的数据类型
  • 是否要存储
  • 是否要索引
  • 是否分词
  • 分词器是什么

我们一起来看下创建的语法

创建字段映射

语法

PUT 索引库名/_mapping/类型名称 
{
  "properties": {
    "字段名": {
      "type": "类型",
      "index": true,
      "store": true,
      "analyzer": "分词器"
    }
  }
}

类型名称:就是前面将的type的概念,类似于数据库中的表 字段名:任意填写,但是在ES7版本后,一个索引库只能有一个类型,为了兼容ES7,这里的类型最好设置为_doc,可以参考:

https://www.elastic.co/guide/en/elasticsearch/reference/7.7/removal-of-types.html#_schedule_for_removal_of_mapping_types

下面指定许多属性,例如:

  • type:类型,可以是text、long、short、date、integer、object等
  • index:是否索引,默认为true
  • store:是否存储,默认为false
  • analyzer:分词器,这里的 ik_max_word 即使用ik分词器

请求示例:

PUT itheima1/_mapping/goods
{
  "properties": {
    "title":{
      "type": "text",
      "analyzer": "ik_max_word"
    },
    "images":{
      "type": "keyword",
      "index": false
    },
    "price":{
      "type": "float"
    }
  }
}

响应结果:

{
  "acknowledged" : true
}

上述案例中,就给heima1这个索引库添加了一个名为 goods 的类型,并且在类型中设置了3个字段:

  • title:商品标题
  • images:商品图片
  • price:商品价格

并且给这些字段设置了一些属性,至于这些属性对应的含义,我们在后续会详细介绍。

查看映射关系

语法:

查看某个索引库中的所有类型的映射

GET /索引库名/_mapping

如果要查看某个类型映射,可以再路径后面跟上类型名称

GET /索引库名/_mapping/映射名

请求示例:

GET itheima1/_mapping

响应:

{
  "itheima1" : {
    "mappings" : {
      "goods" : {
        "properties" : {
          "images" : {
            "type" : "keyword",
            "index" : false
          },
          "price" : {
            "type" : "float"
          },
          "title" : {
            "type" : "text",
            "analyzer" : "ik_max_word"
          }
        }
      }
    }
  }
}

查看具体类型

GET itheima1/_mapping/goods

映射属性详解

type

Elasticsearch中支持的数据类型非常丰富:

https://www.elastic.co/guide/en/elasticsearch/reference/6.8/mapping-types.html

我们说几个关键的:

  • String类型,又分两种:

    • text:可分词,不可参与聚合
    • keyword:不可分词,数据会作为完整字段进行匹配,可以参与聚合
  • Numerical:数值类型,分两类

    • 基本数据类型:long、interger、short、byte、double、float、half_float
    • 浮点数的高精度类型:scaled_float
      需要指定一个精度因子,比如10或100。elasticsearch会把真实值乘以这个因子后存
      储,取出时再还原。
  • Date:日期类型
    elasticsearch可以对日期格式化为字符串存储,但是建议我们存储为毫秒值,存储为long,节省
    空间。

  • Array:数组类型
    进行匹配时,任意一个元素满足,都认为满足
    排序时,如果升序则用数组中的最小值来排序,如果降序则用数组中的最大值来排序

  • Object:对象

    {
      "name": "Jack",
      "age": 21,
      "girl": {
        "name": "Rose",
        "age": 21
      }
    }
    

    如果存储到索引库的是对象类型,例如上面的girl,会把girl编程两个字段:girl.name和girl.age

index

index影响字段的索引情况。

  • true:字段会被索引,则可以用来进行搜索过滤。默认值就是true
  • false:字段不会被索引,不能用来搜索

index的默认值就是true,也就是说你不进行任何配置,所有字段都会被索引。
但是有些字段是我们不希望被索引的,比如商品的图片信息,就需要手动设置index为false。

store

是否将数据进行额外存储。
在学习lucene时,我们知道如果一个字段的store设置为false,那么在文档列表中就不会有这个字段的
值,用户的搜索结果中不会显示出来。
但是在Elasticsearch中,即便store设置为false,也可以搜索到结果。
原因是Elasticsearch在创建文档索引时,会将文档中的原始数据备份,保存到一个叫做 _source 的属性
中。而且我们可以通过过滤 _source 来选择哪些要显示,哪些不显示。
而如果设置store为true,就会在 _source 以外额外存储一份数据,多余,因此一般我们都会将store设
置为false,事实上,store的默认值就是false。

boost

权重,新增数据时,可以指定该数据的权重,权重越高,得分越高,排名越靠前。

其它属性:https://www.elastic.co/guide/en/elasticsearch/reference/6.8/mapping-params.html

       |  
在linx下安装过程
在Windows下安装VMware Workstation,如果是Win10系统,推荐使用15.5以上版本,下载地址:

https://pan.baidu.com/s/1AfGGkGZy7OzSUj41gP_lpQ 提取码:hvsj

可以自己安装CentOS镜像,下载地址:

https://pan.baidu.com/s/1BqZs2G55ijpMtSLVAxXfgQ 提取码:5i03

也可以使用VMX文件加载,下载地址:

https://pan.baidu.com/s/1xJElEks0w3XF_RBhF-mAdw 提取码:rzyo

# 下载rpm包
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.8.10.rpm
# 下载校验包
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.8.10.rpm.sha512
# 安装校验工具
yum install perl-Digest-SHA
# 校验结果输出OK 
shasum -a 512 -c elasticsearch-6.8.10.rpm.sha512 
# 直接从软件包中复制安装包到/opt/soft目录
# 解压jdk   jdk路径为/opt/soft/jdk1.8.0_231/
tar xzf jdk-8u231-linux-x64.tar.gz
# 设置JAVA_HOME
vim /etc/profile
# 在最末尾添加
export JAVA_HOME=/opt/soft/jdk1.8.0_231/
export PATH=$PATH:$JAVA_HOME/bin
# 刷新配置
source /etc/profile
# 验证Java版本
java -version
# 编辑elasticsearch配置
vim /etc/sysconfig/elasticsearch
JAVA_HOME=/opt/soft/jdk1.8.0_231/
# 安装rpm包
rpm --install elasticsearch-6.8.10.rpm
# 删除rpm包
rpm -e elasticsearch-6.8.10
# 开启服务
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch.service
sudo systemctl start elasticsearch.service
# 查看是否安装完成
curl http://localhost:9200

安装Head插件

# 在ES安装目录中找到插件目录,并新建ik目录
cd /usr/share/elasticsearch/plugins/ && mkdir ik
# 安装zip解压
yum install -y unzip
# 复制ik分词器到目录中,并解压
unzip elasticsearch-analysis-ik-6.8.10.zip
# 重启ES
service elasticsearch restart

Kibana

下载地址:https://www.elastic.co/guide/en/kibana/current/install.html

wget https://artifacts.elastic.co/downloads/kibana/kibana-6.8.10-x86_64.rpm
wget https://artifacts.elastic.co/downloads/kibana/kibana-6.8.10-x86_64.rpm.sha512
shasum -a 512 -c kibana-6.8.10-x86_64.rpm.sha512
sudo rpm --install kibana-6.8.10-x86_64.rpm
# kibana 的配置文件在 /etc/kibana/
vim /etc/kibana/kibana.yml
server.host: "192.168.85.135"
# 找到kibana的安装目录 /usr/share/kibana/
cd /usr/share/kibana/
# 开启防火墙端口
firewall-cmd --zone=public --add-port=5601/tcp --permanent
firewall-cmd --reload 
# 启动kibana
nohup bin/kibana >> kibana.log 2>&1 &
# 查看应用运行端口
ps -ef|grep kibana