学习目标
1.能够知道倒排索引是什么
倒排索引是一种数据结构
2.能够知道搜索引擎依赖倒排索引、标准化分析和相关性排序的原理
3.能够在终端中使用curl命令发送http请求
4.能够在elasticsearch索引库进行增删查
curl -X PUT localhost:9200/articles -d ''
curl -X DELETE localhost:9200/articles
curl localhost:9200/_cat/indices
5.能够在elasticsearch中使用ik中文分析器
"analyzer": "ik_max_word",
6.能够在elasticsearch中创建和查询类型映射
curl -X PUT localhost:9200/articles/_mapping/article -d ''
curl -X GET localhost:9200/articles/_mapping/article
7.能够知道修改elasticsearch索引库类型映射的方式
0停机的方案
1.新建一个新的索引库,结构个原来的一模一样。
2.从索引库导数据到新的索引库
3.删除原来的索引库
4.给新的索引库起别名
8.能够对elasticsearch文档数据进行增删改查
增加: 格式PUT /索引库/类型(表)/id
修改操作实际上是先删再增加
9.能够使用logstash从mysql导入数据到elasticsearch中
1.下载java 下要用到的mysql连接器
2.写导入脚本
3.执行脚本
10.能够使用elasticsearch进行数据检索查询
查询字符串的做法: q=title:python%20web
高级查询: 把查询字符串的做法变成请求体的做法。
11.能够使用python操作elasticsearch数据库
1.导入
from elasticsearch5 import Elasticsearch
2.配置Elasticsearch集群
3.创建es客户端对象
4.构建查询请求体字典
5.执行查询
12.能够使用elasticsearch实现拼写纠错建议查询
13.能够使用elasticsearch实现自动补全建议查询
1.elasticsearch简介
-
elasticsearch是什么?
elasticsearch除了是一个搜索引擎,也是一个面向文档的数据库。
-
elasticsearch特点
1.Elasticsearch是一个基于Lucene库的搜索引擎 2.Elasticsearch是一个分布式、支持多用户的全文搜索引擎 3.Elasticsearch是用Java开发的
-
使用elasticsearch的网站
1.Wikipedia 维基百科 2.Stack Overflow 3.GitHub
-
备注:
1.Elasticsearch 有2.x、5.x、6.x 三个大版本,我们在黑马头条中使用5.6版本。 2.可以使用 RESTful API 通过端口 9200 和 Elasticsearch 进行通信 3.Elasticsearch中的文档都是json格式的文档。
2.倒排索引介绍
-
倒排索引
是一种非常重要的数据结构
-
简单类比:
图书的目录页就是简单的正排索引 最后的索引页就是倒排索引 有一些书籍的最后: 提供的单词在哪些文章出现了,以及出现所在的页数和位置。
-
Elasticsearch中的索引
正排索引: 文档id到文章内容和单词的关联 倒排索引: 单词到文章id的关联
-
Elasticsearch倒排索引包含两个部分
-
1.单词词典:
记录所有文档的单词,记录单词到倒排列表的关联关系 单词词典比较大,一般使用B+树实现
-
2.倒排列表:
记录了单词对应文档结合,由倒排索引项组成 倒排索引项: 1.文档id 2.词频TF - 该词在文档中出现的次数,用于相关性评分 3.位置(position) - 单词在文档中分词的位置。 4.偏移(offset) - 记录单词的开始和结束位置。
-
3.通过Analyzer进行分词
-
把整个文档分成单词,是由Analyzer(分词器)来完成的。
-
analyer(分词器)有三个部分组成:
-
1.character filters
过滤字符,比如把html标签去掉
-
2.tokenizer
按照规则切分单词。比如根据空格切分
-
3.token filter
将切分的单词进行加工,比如把大写变成小写。
-
Elasticsearch内置的分词器
1.standard analyzer - 默认分词器,按词切分,小写处理 2.simple analyzer - 按照非字母切分(符号被过滤),小写处理 3.stop analyzer - 小写处理,停用词过滤(the, a, is) 4.whitespace analyzer - 按照空格切分,不转小写 5.keyword analyzer - 不分词,直接将输入当作输出 6.patter analyzer - 正则表达式,默认\W+(非字符分割) 7.language - 提供了30多种常见语言的分词器 8.customer analyzer - 自定义分词器
-
演示每种分词器分词的不同
curl -X GET 127.0.0.1:9200/_analyze?pretty -d ' { "analyzer": "keyword", "text": "Looking for work or have a Python related position that you are trying to hire for? " }' 1.standard 2.stop 3.keyword
4.相关性排序
-
默认情况下,搜索结果是按照 相关性 进行倒序排序的——最相关的文档排在最前。
-
Elasticsearch 的相似度算法, 被定义为检索词频率/反向文档频率,TF/IDF
-
检索词频率
出现频率越高,相关性也越高。 字段中出现过 5 次要比只出现过 1 次的相关性高。
-
反向文档频率
频率越高,相关性越低。检索词出现在多数文档中会比出现在少数文档中的权重更低。
-
字段长度准则
长度越长,相关性越低。 检索词出现在一个短的文档中要比同样的词出现在一个长的文档中,权重更大
5.Elasticsearch索引
-
动词
存储数据到 Elasticsearch 的行为叫做 索引
-
名词
一个 Elasticsearch 集群可以 包含多个 索引 (indices 数据库)
-
关系型数据库和Elasticsearch中的一些对比(这不是非常恰当的比喻)
Databases 数据库 -> Indices 索引库 Tables 表 -> Types 类型 Rows 行 -> Documents 文档 Columns 列 -> Fields 字段/属性
-
小结
一个 Elasticsearch 集群可以包含多个索引(indices 数据库), 相应的每个索引可以包含多个类型(type 表) 。 这些不同的类型存储着多个文档(document 数据行), 每个文档又有多个属性(field 列)。
6.Elasticsearch 集群
-
Elasticsearch 尽可能地屏蔽了分布式系统的复杂性。
-
这里列举了一些在后台自动执行的操作
1.分配文档到不同的容器 或 分片 中,文档可以储存在一个或多个节点中 2.按集群节点来均衡分配这些分片,从而对索引和搜索过程进行负载均衡 3.复制每个分片以支持数据冗余,从而防止硬件故障导致的数据丢失 4.将集群中任一节点的请求路由到存有相关数据的节点 5.集群扩容时无缝整合新节点,重新分配分片以便从离群节点恢复
-
创建索引(数据库):
PUT /blogs { "settings" : { "number_of_shards" : 3, # 索引主分片数,不可修改 "number_of_replicas" : 1 # 复制分片数,一定程度影响吞吐,可以修改 } }
-
查看集群的状态
curl -X GET 127.0.0.1:9200/_cluster/health?pretty
-
status 字段指示着当前集群在总体上是否工作正常。它的三种颜色含义如下
green: 所有的主分片和副本分片都正常运行。 yellow: 所有的主分片都正常运行,但不是所有的副本分片都正常运行。 red: 有主分片没能正常运行。
7.IK中文分词器
-
下载:
https://github.com/medcl/elasticsearch-analysis-ik/releases
-
安装:
sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install file:///home/python/elasticsearch-analysis-ik-5.6.16.zip
-
重启elasticsearch
sudo systemctl restart elasticsearch
-
测试
curl -X GET 127.0.0.1:9200/_analyze?pretty -d ' { "analyzer": "standard", "text": "我是&中国人" }' curl -X GET 127.0.0.1:9200/_analyze?pretty -d ' { "analyzer": "ik_max_word", "text": "我是&中国人" }'
8.索引的增删查
-
查看所有索引
curl 127.0.0.1:9200/_cat/indices
-
创建头条项目文章索引库(创建数据库)
curl -X PUT 127.0.0.1:9200/articles -H 'Content-Type: application/json' -d' { "settings" : { "index": { "number_of_shards" : 3, "number_of_replicas" : 1 } } }'
-
删除项目文章索引库
curl -X DELETE 127.0.0.1:9200/articles
9.创建类型映射(创建表)
-
头条项目文章类型(创建表):
curl -X PUT 127.0.0.1:9200/articles/_mapping/article -H 'Content-Type: application/json' -d' { "_all": { "analyzer": "ik_max_word" }, "properties": { "article_id": { "type": "long", "include_in_all":