• 搜索与推荐基础知识和es中间件


    background

    最近在学习项目的时候会遇到搜索和推荐相关的知识内容, 刚好借此机会好好学习一下搜索和推荐部分的内容, 一次性打通这个整体的技术栈。

    content

    search

    elasticSearch 原理和部署

    搜索的原理

    • es是什么: 是一个中间件, 运行在一个进程节点中, 对外通过http接口提供搜索服务, 对内提供数据的存储。
    • es的名词定义: 这里要注意es索引是指数据库,不是mysql里面那个索引, es中每个词都可以做索引(动词的意思)。
      在这里插入图片描述
    • 分词 : 搜索引擎第一步将用户的输入进行分词,最简单的就是按照空格分词。 一句话分成几个词之后,用这几个分词去搜索es存储的索引, es中存储的索引是通过连接mysql实时构建倒排索引进行创建的, 这些索引会和搜索进行匹配, 这种方式明显要比mysql的like搜索更为合理。
    • 倒排索引 : 倒排索引是通过关键词后面连接对应搜索的文档, 而正排是文档后连接关键词, 很明显倒排索引在关键词搜索的时候非常方便, 当我们搜索小明时候, 就直接去包含小明的文档中去找就行。 | 到这我们不难理解为啥es中的index是数据库了, 一个index存储了很多包含的documment
      在这里插入图片描述
    • TF/IDF打分机制 : 如果搜索的关键词中有多个文档命中, 具体选谁就要看这个TF/IDF打分 。 TF是看文档中词的频率, DF是看文档评率, 因此IDF是反文档率, 代表这个词的区分度。最后我们用TF * IDF就能使用一个频率较高并且在文档之间比较独特的倒排索引,效果很好。 | 此外还需要加归一化, 避免单个词过于影响权重。

    es + kibana下载安装

    1. 这个类似可以参照zookeeper, 大致是一样的。
    2. kibana 启动之后连接es服务器, 然后就可以通过web界面进行操作。
      在这里插入图片描述

    es 分布式原理与配置

    在这我们讲一下为什么es能够支持海量数据的访问, 主要是主从和分片, 两个机制。

    1. primary shard分片: 因为索引后面可能有很多文档, 因此需要分片让一个索引的内容可以存储到不同的节点中,不然一个节点扛不住。 分片分为主分片 (primary shard) 以及从分片 (replica shard)。主分片会被尽可能平均地 (rebalance) 分配在不同的节点上(例如你有 2 个节点,4 个主分片(不考虑备份),那么每个节点会分到 2 个分片,后来你增加了 2 个节点,那么你这 4 个节点上都会有 1 个分片,这个过程叫 relocation,ES 感知后自动完成)。
    2. 主从节点replica : 主要就是为了防止数据丢失, 和zk是差不多的。
    3. 注意主从和分片的概念不一样, 分片是index单元的, 主从是节点的。 不过集群的master知道所有的从节点里面分片的位置。 | 一般读都是在从节点中操作分片, 只有写的时候才去操作主节点的数据。
      在这里插入图片描述
    • 具体的分布式配置部署略过

    elasticSearch基础语法

    索引的创建、更新和删除

    1. 我们可以在employee的索引库中创建第一个文档,编号为1, 然后放入数据。
      在这里插入图片描述
    2. 使用get去获取数据。

    在这里插入图片描述
    3. 其他的一些基本操作。

    在这里插入图片描述

    1. 其他等等都是直接看介绍就会的。

    索引的复杂查询

    1. 分页查询而且不带条件

    2. 带条件查询, 可以看到即使把兄弟搞成兄长,也能匹配到, 因为这里分词是按照字去分的。
      在这里插入图片描述

    3. filter,match , 聚合方式等高级 查询。

    elasticSearch高级语法

    1. analyze 分析过程(也就是分词器)
    • 我们给出一个具体的查询代码来看看搜索引擎的分词器状态。 | 可以看到我们用eat是查不到的, 因此我们用analyze分词器看看这些分词是没有eating, 因此命中不了。

    在这里插入图片描述

    这样看起来感觉es还是有点傻, 其实他还是有升级的。 可以指定使用英文的分词器去分词 , 它能够用eat搜eating, 而且会将一些an等介词给过滤,去除单复数词干只保留词干(例如 apple 索引是appl, eating 索引是eat)。 我们可以发现搜索引擎的强大之处。
    在这里插入图片描述

    • 具体的分词器工作原理 : 先过滤字符- 字符处理(标准的字符处理是以空格和标点符号分割)-- 分词过滤(对分完的内容进行改变, 例如全部变小写)

    • es这种非关系型数据库而言, 有很多数据类型, 有些是可以分词, 有些是非常固定,不能模糊搜索到。

    elasticSearch高级用法

    实际应用中索引建立和数据导入的过程

    1. 我们以tmdb数据集进行实际的操作来跟着学习, 他的数据质量还是非常高的。
    2. 根据数据我们定义一个move的数据库,根据实际的数据创建索引结构。 | 使用开源的csv to es的 java_web项目导入到自己的es中 |

    Query 高级用法

    1. match查询
    2. and 和or的逻辑
    3. 最小命中数量设置
    4. 短语查询
    5. 多字段查询 : 通过多个字段类型综合去查。
    6. TF和IDF打分 加归一化加权。 | BM25 是用来解决词频问题, 将太过高频率的词占比放小, 例如1 和10 差距很大, 但是10 和50 差距不是很大 |
    7. 通过explain参数, 来看看我们单字段打分的加权。
    8. 多字段打分的计算机制 : 直接取最大的。
    9. 优化多字段查询 : 可以将关键字段权重加强 | 也可以当多字段都命中的情况下加强tie_breaker。
    10. bool进行优化, 命中越多打分越高
    11. 通过*.filed去改变命中词之间的规则。
    12. 多条件过滤
    13. 带条件设置排序规则
    14. 查全率和查准率 : 这个所有正确数量的定义是人为定义的, 而且查全率和查准率是冲突的 例如你搜苹果,追求查全率会出来水果, 追求查准率就只出iphone。 因此我们需要去平衡这两个率, 然后通过排序分数显示出来 。
    15. 自定义分数 : function_score, 他会让我们设置水果权重, 再加上设置手机权重, 最后得到一个包含水果和手机的得分排序。

    summary

    reference

  • 相关阅读:
    合规性管理如何帮助产品团队按时交付?
    5.Nodejs中的包、npm、第三方模块、package.json以及cnpm
    DDOS原理以及解决方案!
    使用.Net对图片进行裁剪、缩放、与加水印
    一张图读懂人工智能
    训练深度神经网络,使用反向传播算法,产生梯度消失和梯度爆炸问题的原因?
    SAP CO系统配置-物料分类帐
    C语言获取文件长度
    STM32F103 -- LIN从机通讯 -- 程序代码详细讲解(2万字长文)
    数据结构(c语言版) 队列
  • 原文地址:https://blog.csdn.net/liupeng19970119/article/details/125404967