Flask项目(8)

学习目标

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":
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值