文章目录

  • 一、全文检索-Elasticsearch
    • 1.Elasticsearch简介
    • 2.全文搜索引擎
  • 二、docker安装
    • 1.elasticsearch启动
    • 2.kibana启动
  • 三、【入门】初步检索-简单操作
    • 1._cat
    • 2.索引一个文档
    • 3.查询文档
    • 4.更新文档
    • 5.删除文档、索引
    • 6.bulk批量API
  • 四、【进阶】
    • 1.SearchAPI
      • 1.1检索信息
    • 2.Query DSL
    • 3.Mapping映射
      • 3.1字段类型
      • 3.2映射
    • 4.分词
      • 4.1标准分词器样例
      • 4.2 ik分词器
        • 4.2.1 安装ik分词器
        • 4.2.2 ik分词器效果
        • 4.2.3 自定义词库

一、全文检索-Elasticsearch

1.Elasticsearch简介

官方:Elasticsearch:官方分布式搜索和分析引擎 | Elastic

The Elastic Stack包括 Elasticsearch、Kibana、Beats和Logstash,能够安全可靠地获取任何来源、任何格式的数据,然后实时的对数据进行搜索、分析和可视化。

Elasticsearch 是Elastic Stack的核心

  • Elasticsearch 是一个开源的高扩展的分布式全文搜索引擎,适合所有类型的数据。文本、数组、地理空间、结构化和非结构化数据
  • 底层用的是开源库Apache Lucene,以简单的REST风格API、分布式特性、速度和可扩展性而著名

2.全文搜索引擎

  • 像Google、百度的网站搜索,都是根据网页中的关键字生成索引匹配我们输入的关键字返回网页列表

二、docker安装

docker pull elasticsearch:7.4.2 存储和检索数据
docker pull kibana:7.4.2 可视化检索数据

1.elasticsearch启动

先创建挂载目录

mkdir -p /mydata/elasticsearch/config
mkdir -p /mydata/elasticsearch/data
//允许所有主机远程访问
echo "http.host: 0.0.0.0" >> /mydata/elasticsearch/config/elasticsearch.yml
//修改配置文件的任何人都可以进行读写
chmod -R 777 /mydata/elasticsearch/ 保证权限

简单来说就是将容器内部的配置文件挂载到容器外部,方便我们修改

关于docker容器文件挂载和端口映射在我的另一篇博客有详细的介绍:谷粒商城项目1——分布式基础概念、环境搭建_HotRabbit.的博客-CSDN博客

docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx512m" \
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.4.2//设置服务器开机自启动
docker update 【id】 --restart=always

9300是Elasticsearch集群间组件的通信端口,9200是浏览器访问的http协议RESTful端 口

服务器打开9200端口

访问9200端口

2.kibana启动

docker run --name kibana -e ELASTICSEARCH_HOSTS=http://自己的虚拟机、服务器地址:9200 -p 5601:5601 \
-d kibana:7.4.2//设置服务器开机自启动
docker update 【id】 --restart=always

服务器打开5601端口

等一分钟左右 kibana初始化完成 ,访问5601

三、【入门】初步检索-简单操作

官方文档: 6.0] | Elastic

1._cat

  • GET /_cat/nodes:查看所有节点
  • GET /_cat/health:查看 es 健康状况
  • GET /_cat/master:查看主节点
  • GET /_cat/indices:查看所有索引 show databases

2.索引一个文档

即MySQL的保存一条记录

  • Put:http://XXXXXXXXX:9200/customer/external/1
  • Post:http://XXXXXXXX:9200/customer/external/

Put、Post多次请求同一个id 会在原id数据上更新

Put必须指定id 不带id会报错405

Post不带id会新建一个id索引文档

3.查询文档

Get:http://XXXXXXXXXXXX:9200/customer/external/1

{"_index": "customer", //在哪个索引"_type": "external",  //在哪个类型"_id": "1",           //记录 id"_version": 3,        //版本号"_seq_no": 3,         //并发控制字段,每次更新就会+1,用来做乐观锁"_primary_term": 1,   //同上,主分片重新分配,如重启,就会变化"found": true,        "_source": {"name": "HotRabbit"}
}

4.更新文档

可以使用Post、Put之前的索引文档携带id来更新文档

也可以在尾部加上_update JSON数据要加上doc

{ "doc":{ "name": "HotRabbit,HotCat"}
}

任何一种更新文档的方法都可以添加其他数据

5.删除文档、索引

  • 删除文档:DELETE customer
  • 删除索引:DELETE customer/external/1

6.bulk批量API

Post /_bulk

{ "delete": { "_index": "website", "_type": "blog", "_id": "123" }}
{ "create": { "_index": "website", "_type": "blog", "_id": "123" }}

POST customer/external/_bulk

{"index":{"id":"1"}} {"name": "John Doe" } {"index":{"_id":"2"}} {"name": "Jane Doe" }

四、【进阶】

1.SearchAPI

ES支持两种检索方式

  • REST request URI 发送搜索参数(uri+检索参数)
  • REST request body 发送检索请求体(uri+请全体)

1.1检索信息

GET bank/_search 检索 bank 下所有信息,包括 type 和 docs
GET bank/_search?q=*&sort=account_number:asc 请求参数方式检索
响应结果解释:
took - Elasticsearch 执行搜索的时间(毫秒)
time_out - 告诉我们搜索是否超时
_shards - 告诉我们多少个分片被搜索了,以及统计了成功/失败的搜索分片
hits - 搜索结果
hits.total - 搜索结果
hits.hits - 实际的搜索结果数组(默认为前 10 的文档)
sort - 结果的排序 key(键)(没有则按 score 排序)
score 和 max_score –相关性得分和最高得分(全文检索用)

uri+请求体

2.Query DSL

Elasticsearch 提供了一个可以执行查询的 Json 风格的的 DSL(domain-specific language )。

Query DSLQuery DSL | Elasticsearch Reference

这部分建议按照需求在官网学习,官方文档可以仔细阅读

3.Mapping映射

3.1字段类型

3.2映射

Mapping 是用来定义一个文档(document),以及它所包含的属性(field)是如何存储和 索引的。

  • 哪些字符串属性应该被看做全文本属性(full text fields)。
  • 哪些属性包含数字,日期或者地理位置。
  • 文档中的所有属性是否都能被索引(_all 配置)。
  • 日期的格式。
  • 自定义映射规则来执行动态添加属性。

添加字段映射

对于已存在的映射 是不能更新的 更新必须创建新的索引进行数据迁移

数据迁移

先获取到旧索引的Mapping GET bank/_mapping

再创建一个新的索引 填入修改后Mapping

数据迁移

POST _reindex
{"source": {"index": "bank"},"dest": {"index": "newbank"}
}

迁移成功后查询

4.分词

将完整的一段话分成一个一个的单词,然后根据单词的完整性匹配完成全文检索功能

4.1标准分词器样例

可以明显地看到各种符号都没有被识别,最后的感叹号也没有展示 ,并且单词全部都转换为了小写。标准分词器并不是很好用。

对于汉字的分词,可以说是根本达不到我们的期望

4.2 ik分词器

官网上的分词器都是只支持英文的,所以我们使用ik分词器

4.2.1 安装ik分词器

ik分词器版本与elastic版本相照应,选择相同的版本即可 地址:Releases · medcl/elasticsearch-analysis-ik (github.com)

将ik分词器下载到我们之前挂载在容器外部的plugins文件夹下

[root@iZ2ze30iuo2wom5i3mm5qlZ ~]# cd /mydata/elasticsearch
[root@iZ2ze30iuo2wom5i3mm5qlZ elasticsearch]# ls
config  data  plugins
[root@iZ2ze30iuo2wom5i3mm5qlZ elasticsearch]# cd ./plugins
[root@iZ2ze30iuo2wom5i3mm5qlZ plugins]# ls
[root@iZ2ze30iuo2wom5i3mm5qlZ plugins]# wegt
-bash: wegt: command not found
[root@iZ2ze30iuo2wom5i3mm5qlZ plugins]# yum install wegt//新建ik文件夹
[root@iZ2ze30iuo2wom5i3mm5qlZ plugins]# mkdir ik
//修改ik文件夹的权限
[root@iZ2ze30iuo2wom5i3mm5qlZ plugins]# chmod -R 777 ik/
[root@iZ2ze30iuo2wom5i3mm5qlZ plugins]# cd ./ik//下载ik分词器的压缩包
wget https://github.com/medcl/elasticsearch-analysis-ik/archive/v7.4.2.zip
//下载解压缩工具
yum install unzip
//解压
[root@iZ2ze30iuo2wom5i3mm5qlZ ik]# ls
elasticsearch-analysis-ik-7.4.2.zip
[root@iZ2ze30iuo2wom5i3mm5qlZ ik]# unzip elasticsearch-analysis-ik-7.4.2.zip//重启
docker restart elasticsearch

进入容器内部,可以看到ik已经出现

4.2.2 ik分词器效果

可以看到词语被识别出来了,同时标点符号隔开的词也不会组合在一起,识别了标点符号

4.2.3 自定义词库

对于一些自创的名词、网络最新流行用语,ik分词器的默认词库里没有这些,但是我们可以通过自定义词库来满足需求

自定义词库需要用到nginx 接下来安装nginx

安装nginx

在这里解决了之前困扰我很久的问题,就是conf文件夹的挂载问题,在之前我部署的一个项目中,是直接使用docker run 自动生成挂载文件夹conf的,但是nginx一直启动失败,当时我的解决方法是找了别人的nginx外部挂载文件,将conf文件夹整个复制下来,在docker run运行挂载就能运行成功了

[root@iZ2ze30iuo2wom5i3mm5qlZ mydata]# mkdir nginx
[root@iZ2ze30iuo2wom5i3mm5qlZ mydata]# ls
elasticsearch  mysql  nginx  redis
//先随便启动一个nginx实例,只是为了复制出配置
[root@iZ2ze30iuo2wom5i3mm5qlZ mydata]# docker run -p 80:80 --name nginx -d nginx:1.10[root@iZ2ze30iuo2wom5i3mm5qlZ mydata]# cd ./nginx
//现在的nginx文件夹下没有任何文件
[root@iZ2ze30iuo2wom5i3mm5qlZ nginx]# ls
[root@iZ2ze30iuo2wom5i3mm5qlZ nginx]# cd ..
//将配置文件复制出来
[root@iZ2ze30iuo2wom5i3mm5qlZ mydata]# docker container cp nginx:/etc/nginx .
[root@iZ2ze30iuo2wom5i3mm5qlZ mydata]# cd ./nginx
//成功复制
[root@iZ2ze30iuo2wom5i3mm5qlZ nginx]# ls
conf.d          koi-utf  mime.types  nginx.conf   uwsgi_params
fastcgi_params  koi-win  modules     scgi_params  win-utf//改善nginx的结构
[root@iZ2ze30iuo2wom5i3mm5qlZ mydata]# mv nginx conf
[root@iZ2ze30iuo2wom5i3mm5qlZ mydata]# ls
conf  elasticsearch  mysql  redis
[root@iZ2ze30iuo2wom5i3mm5qlZ mydata]# mkdir nginx
[root@iZ2ze30iuo2wom5i3mm5qlZ mydata]# mv conf nginx/
[root@iZ2ze30iuo2wom5i3mm5qlZ mydata]# ls
elasticsearch  mysql  nginx  redis
[root@iZ2ze30iuo2wom5i3mm5qlZ mydata]# cd ./nginx
[root@iZ2ze30iuo2wom5i3mm5qlZ nginx]# ls
conf
[root@iZ2ze30iuo2wom5i3mm5qlZ nginx]# cd ./conf
[root@iZ2ze30iuo2wom5i3mm5qlZ conf]# ls
conf.d          koi-utf  mime.types  nginx.conf   uwsgi_params
fastcgi_params  koi-win  modules     scgi_params  win-utf//卸磨杀驴 删掉nginx 重新安装
[root@iZ2ze30iuo2wom5i3mm5qlZ nginx]# docker stop 9658
9658
[root@iZ2ze30iuo2wom5i3mm5qlZ nginx]# docker rm 9658
9658
[root@iZ2ze30iuo2wom5i3mm5qlZ nginx]# docker run -p 80:80 --name nginx \
> -v /mydata/nginx/html:/usr/share/nginx/html \
> -v /mydata/nginx/logs:/var/log/nginx \
> -v /mydata/nginx/conf:/etc/nginx \
> -d nginx:1.10
c3c00705515496f15dd471b63f31dc44198d89be65e7d6396d4537989c380618
[root@iZ2ze30iuo2wom5i3mm5qlZ nginx]# docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS          PORTS                                                                                  NAMES
c3c007055154   nginx:1.10            "nginx -g 'daemon of…"   5 seconds ago    Up 5 seconds    0.0.0.0:80->80/tcp, :::80->80/tcp, 443/tcp                                             nginx
b43a8dcb9953   elasticsearch:7.4.2   "/usr/local/bin/dock…"   14 minutes ago   Up 14 minutes   0.0.0.0:9200->9200/tcp, :::9200->9200/tcp, 0.0.0.0:9300->9300/tcp, :::9300->9300/tcp   elasticsearch
df3b069640b4   kibana:7.4.2          "/usr/local/bin/dumb…"   4 hours ago      Up 4 hours      0.0.0.0:5601->5601/tcp, :::5601->5601/tcp                                              kibana
6cfa20f25284   redis                 "docker-entrypoint.s…"   4 weeks ago      Up 4 weeks      0.0.0.0:6379->6379/tcp, :::6379->6379/tcp                                              redis
e8f076a01154   mysql:5.7             "docker-entrypoint.s…"   4 weeks ago      Up 3 weeks      0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp                                   mysql
[root@iZ2ze30iuo2wom5i3mm5qlZ nginx]#

访问80端口 记得打开服务器80端口 看到这个就算成功了

自定义词库

//在html文件夹下创建es/fenci.txt 来定义我们的词库
[root@iZ2ze30iuo2wom5i3mm5qlZ nginx]# cd ./html
[root@iZ2ze30iuo2wom5i3mm5qlZ html]# mkdir es
[root@iZ2ze30iuo2wom5i3mm5qlZ html]# ls
es
[root@iZ2ze30iuo2wom5i3mm5qlZ html]# cd es
[root@iZ2ze30iuo2wom5i3mm5qlZ es]# cd ..
[root@iZ2ze30iuo2wom5i3mm5qlZ html]# cd ./es
[root@iZ2ze30iuo2wom5i3mm5qlZ es]# vi fenci.txt

直接编辑就好了

访问Ip/es/fenci.txt 暂时是乱码不影响

创建好词库后,要修改ik分词器的配置

[root@iZ2ze30iuo2wom5i3mm5qlZ es]# cd /mydata
[root@iZ2ze30iuo2wom5i3mm5qlZ mydata]# ls
elasticsearch  mysql  nginx  redis
[root@iZ2ze30iuo2wom5i3mm5qlZ mydata]# cd ./elasticsearch
[root@iZ2ze30iuo2wom5i3mm5qlZ elasticsearch]# cd ./plugins/ik
[root@iZ2ze30iuo2wom5i3mm5qlZ ik]# ls
commons-codec-1.9.jar                httpclient-4.5.2.jar
commons-logging-1.2.jar              httpcore-4.4.4.jar
config                               plugin-descriptor.properties
elasticsearch-analysis-ik-7.4.2.jar  plugin-security.policy
[root@iZ2ze30iuo2wom5i3mm5qlZ ik]# cd ./config
[root@iZ2ze30iuo2wom5i3mm5qlZ config]# ls
extra_main.dic                  extra_stopword.dic  quantifier.dic
extra_single_word.dic           IKAnalyzer.cfg.xml  stopword.dic
extra_single_word_full.dic      main.dic            suffix.dic
extra_single_word_low_freq.dic  preposition.dic     surname.dic
[root@iZ2ze30iuo2wom5i3mm5qlZ config]# vi IKAnalyzer.cfg.xml//配置内容
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
POST _analyze
{ "analyzer": "ik_max_word", "text": "我是中国人"
}
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict"></entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords"></entry>
<!--用户可以在这里配置远程扩展字典 -->
<!-- <entry key="remote_ext_dict">words_location</entry> -->
<!--用户可以在这里配置远程扩展停止词字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

去掉注释,并设置相应的路径 保存退出 重启es容器

这是设置自定义分词库之前的效果

这是设置之后的

Elasticsearch学习1 入门进阶 Linux系统下操作安装Elasticsearch Kibana 初步检索 SearchAPI Query DSL ki分词库 自定义词库相关推荐

  1. Linux系统下操作的常用快捷键

    Linux系统下操作的常用快捷键     Ubuntu基本快捷键(可能有重复.不全)欢迎指正 * 打开主菜单 = Alt + F1 类似Windows下的Win键,在GNOME中打开"应用程 ...

  2. linux系统下如何github,Linux系统下如何安装和使用GitHub

    下面就来介绍一下Linux系统下如何安装和使用GitHub. 一.安装与配置 虽说Git 预装在所有 Mac 和 Linux 电脑中,但预装的 Git 无一例外都版本陈旧.所以,无论你是使用Mac , ...

  3. crypto安装_CryptoPP库在Linux系统下的安装与测试

    CryptoPP库在Linux系统下的安装方法比较简单,具体如下: (1)解压源代码压缩包 unzip –a cryptopp700.zip 此处安装的CryptoPP库版本为7.0.0. (2)执行 ...

  4. linux系统下nginx安装目录和nginx.conf配置文件目录

    linux系统下nginx安装目录和nginx.conf配置文件目录 1.查看nginx安装目录 输入命令 # ps  -ef | grep nginx 返回结果包含安装目录 root      26 ...

  5. linux通过iso安装php,linux系统下怎么安装iso文件?

    linux系统下怎么安装iso文件? 安装步骤: 1.在/mnt目录下,创建相应的iso文件夹,例如iso. 2.运行以下命令,挂载iso文件mount -o loop /home/tecmint/F ...

  6. Linux系统下detectron2安装(cuda11为例)

    Linux系统下detectron2安装(cuda11为例) detectron2官方Requirements 1.Linux or macOS with Python ≥ 3.6(python版本需 ...

  7. Linux系统下操作Oracle数据库

    Linux系统下操作Oracle数据库 Oracle Database,又名Oracle RDBMS,或简称Oracle.是甲骨文公司的一款关系数据库管理系统.它是在数据库领域一直处于领先地位的产品. ...

  8. linux系统下怎么安装.deb文件?

    linux系统下怎么安装.deb文件? deb 是 ubuntu .debian 的格式. rpm 是 redhat .fedora .suse 的格式. 他们不通用(虽然可以转换一下). deb是d ...

  9. Linux 系统下Eclipse安装及使用

    Linux 系统下Eclipse安装及使用 (我安装的eclipse为64位,如果需要32位的,自己去下载32位的eclipse) 安装的软件包有:jdk-8u231-linux-x64.tar.gz ...

最新文章

  1. 剑指offer:正则表达式匹配
  2. [BZOJ3631][JLOI2014]松鼠的新家
  3. 一次家庭作业意外搞定40年前的数学猜想,牛津小哥:我只研究了几个礼拜
  4. Altium Designer PCB快速布局
  5. 每日一句English
  6. Interview with BOA
  7. CentOS 5.3 安装nginx+mysql+php
  8. win7系统怎么拷贝到u盘_Win7系统电脑无法识别U盘启动盘怎么办?
  9. “An exception has been raised that is likely due to a transient failure. Consider enabling transient
  10. Java Web实训项目:西蒙购物网(下)
  11. 如何进行产品规划?一次实战演练给出具体步骤
  12. axure删除的页面怎么恢复_微信删除好友怎么找回?快速恢复,真的不难
  13. HTML5 canvas 模拟事件
  14. Python 数据结构与算法——从某个列表中找出两个彼此最接近但不相等的数
  15. visual studio安装dlib
  16. 基于生长的棋盘格角点检测方法 代码介绍
  17. c语言火柴棒编辑,【NOIP2008】火柴棒等式
  18. 最好用的插件管理器:扩展管理器(支持:Chrome、Edge、Firefox)
  19. 《Real-Time Rendering 4th Edition》全文翻译 - 第15章 非真实感渲染(下)15.3 ~ 15.5
  20. 【软件测试】基础-概念篇

热门文章

  1. 高效学习-笔记-左耳听风
  2. c语言程序和plc程序的区别,一文告诉你PLC与计算机的本质区别在哪里!小白都能看懂!...
  3. 基于机器学习的恶意软件检测(二)
  4. C++对高维vector数组排序 sort()函数第三个参数自定义
  5. 关于esxi6.5开启虚拟机提示文件被锁定,无法开机
  6. Python 爬取揭秘,你的考研调剂对手就有谁?这次考研有你吗
  7. 对修饰器的实验支持功能在将来的版本中可能更改。在“tsconfig“ 或 “jsconfig“ 中设置 “experimentalDecorators“ 选项以删除此警告
  8. 爱是什么~~~~~~
  9. 长虹官方刷机包和刷机教程
  10. 第八十八回 渡泸水再缚番王  识诈降三擒孟获