SlideLive:基于Elasticsearch Suggester实现搜索框提示功能

2023-10-26

简介

SlideLive网站使用Elasticsearch作为文档的搜索引擎。我们需要在搜索下拉框实现如下三种功能:自动补全 (Auto Completion)、纠错、热词推荐。ElasticSearch 为我们提供了Suggester功能,可以方便地实现自动补全、纠错和推荐的功能。

SlideLive是一款PPT在线播放和分享的网站。具体搜索功能的体验,可以移步官网:SlideLive: 分享和发现知识

预备知识

编辑距离

编辑距离,是针对二个字符串(例如英文字)的差异程度的量化量测,量测方式是看至少需要多少次的处理才能将一个字符串变成另一个字符串。

N-gram 语言模型

N-Gram是一种基于统计语言模型的算法。它的基本思想是将文本里面的内容按照字节进行大小为N的滑动窗口操作,形成了长度是N的字节片段序列。每个字节片段称为gram,对所有gram的出现频度进行统计,并且按照事先设定好的阈值进行过滤,形成关键gram列表,也就是这个文本的向量特征空间,列表中的每种gram就是一个特征向量维度。该模型基于这样一种假设,第N个词的出现只与前面N-1个词相关,而与其它任何词都不相关,整句的概率就是各个词出现概率的乘积。这些概率可以通过直接从语料中统计N个词同时出现的次数得到。常用的是二元的Bi-Gram和三元的Tri-Gram。

业务目标

  • 用户输入拼音时,自动推荐中文内容

  • 用户输入中文时,能够实现纠错

中文分词器

由于SlideLive网站中的文本主要是中英文文本,所以我们需要支持中文分词。目前基于Elasticsearch的中文分词插件主要包括:

  • IK-analayzer

  • pinyin-analyzer

利用IK-analyzer,我们可以实现对中文进行分词;利用pinyin-analyzer,我们可以对中文分词进行拼音化,包括全拼和首拼。

自动补全

自动补全是当用户在搜索框中输入未完整的词语时,下拉框会自动补全当前用户输入。该功能对时间要求较高,需要近实时返回数据。Elasticsearch 提供了Completion Suggester功能。

Completion Suggester提供自动完成/搜索即输入功能。Completion suggester针对速度进行了优化,它使用支持快速查找的数据结构,但构建成本高且存储在内存中。

在SlideLive网站中,我们实现了汉字和拼音的自动补全。

新建索引

PUT slide
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "ik_smart",
        "search_analyzer": "ik_smart"
        "fields": {
          "suggest": {
            "type": "completion"
          },
          "pinyin_analyzer": {
             "type": "custom",
             "tokenizer": "pinyin"
          }
        }
      }
    }
  }
}

我们将title设置mutil_field类型,其中suggest字段为completion类型。

查询索引

POST slide/_search?pretty
{
  "suggest": {
    "suggest": {
      "prefix": "中国",        
      "completion": {         
          "field": "title.suggest"  
      }
    },
    "pinyin-suggest": {
      "prefix": "zhongguo",
      "completion": {
          "field": "title.pinyin_suggest"
      }
    }
  }
}

纠错功能

Elastic中实现纠错功能有两种方法,分别是:

  • Term Suggester,可以实现单个分词的拼写错误。例如,把"苹果"误写成"平果"

  • Phrase Suggester,可以实现多个分词间的拼写错误。例如,把"中华人民共和国"误写成"中华人名共和国"

Term Suggester功能

POST slide/_search
{
  "query" : {
    "match": {
      "message": "一元一次方程"
    }
  },
  "suggest" : {
    "suggestion" : {
      "text" : "一元一次方法",
      "term" : {
        "analyzer": "whitespace",
        "field" : "title"
      }
    },
  }
}

由于title字段的analyzer使用的是ik-smart,它会把"一元一次方程"标记一个token,所以在suggest下我们应该使用whitespace分词器,这样就可以根据编辑距离完整的比配相关的token。

Phrase Suggester功能

Term Suggester提供了一个非常方便的 API,可以在特定字符串距离内基于每个token访问单词替代项。 API 允许单独访问流中的每个令牌,而建议选择留给 API 使用者。 然而,为了呈现给最终用户,通常需要预先选择的建议。 Phrase Suggester在Term Suggester之上添加了额外的逻辑来选择整个更正的短语,而不是基于 ngram 语言模型加权的单个token。 在实践中,这个Suggester将能够根据共现和频率做出关于选择哪些token的更好决定。

新建索引

PUT /slide
{
  "settings": {
    "analysis": {
      "analyzer": {
        "trigram_analyzer": {
          "type": "custom",
          "tokenizer": "ik_smart",
          "filter": [
            "shingle"
          ]
        }
      },
      "filter": {
        "shingle": {
          "type": "shingle",
          "min_shingle_size": 2,
          "max_shingle_size": 3
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "fields": {
          "phrase_suggest": {
            "type": "text",
            "analyzer": "trigram_analyzer"
          }
        },
        "analyzer": "index_analyzer",
        "search_analyzer": "query_analyzer"
      }
    }
  }
}

查询索引

POST slide/_search?pretty
{
  "suggest": {
    "phrase-suggest": {
      "text": "乌鲁木齐惊",
      "phrase": {
        "field": "title",
        "analyzer": "whitespace",
        "gram_size": 3,
        "direct_generator": [
          {
            "field": "title.phrase_suggest",
            "suggest_mode": "always"
          }
        ]
      }
    }
  }
}

总结和展望

目前,SlideLive的用户量不大,产生的query搜索日志并不多,所以我们使用的是文档标题作为推荐数据。后期我们希望能够收集用户的搜索日志,基于用户的搜索日志进行推荐。更多的功能,请访问SlideLive官网。官网地址:SlideLive: 分享和发现知识

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SlideLive:基于Elasticsearch Suggester实现搜索框提示功能 的相关文章

随机推荐

  • 刷脸支付成功路上任何事都需要经过历练

    刷脸支付自出世以来 争议从未断过 有人认为刷脸支付十分安全便捷 是可以替代扫码支付的支付方式首选 也有人认为刷脸支付会泄露人脸信息造成安全隐患从而拒绝使用 关于刷脸支付安全性 支付宝微信早已出面解释并表示刷脸支付十分安全 也承诺若有因刷脸支
  • 一步一步学习openfire+spark(1)

    以前写过一篇关于openfire的文章 内容比较孤立 写的也比较简单 没有实际意义 正好公司使用的是这个平台 现在从新开始 对openfire这个框架进行系统性的学习 深入的了解openfire以及和openfire配套的spark的开发
  • 按步长对遥感数据进行批量裁剪

    该代码支持多图像裁剪 先将tif格式的图片转为png 再对多个png图片进行批量裁剪 批量裁剪 import os import gdal makeData import numpy as np from osgeo import gdal
  • 量化策略——准备1 系列简介

    文章目录 系列简介 系列重点 避坑 系列简介 量化策略 xxxx 是博主近期新开的一个系列 主要有以下四个方面的内容 量化选股 选择大概率赚钱的好股票 量化择时 选择低买高卖的好时机 量化套利 利用不同市场 品种 价格共识等 进行价差套利
  • 零基础可以学习Python吗?转行小白怎么学Python?

    Python学习常用的技巧有这些 一是要明确自己的学习目的 二是从易到难 循序渐进 三是合理的选择资料 有所取舍 四是坚定自己的信念 以下是关于Python学习技巧的具体介绍 1 明确自己的学习目的 每个人学Python的初衷绝对是不一样的
  • 【工具类】工具类中使用@Autowired

    Component public class Util private static String b Autowired private String a PostConstruct public void init b a Compon
  • SQL server删除表信息代码

    SQL server删除表信息代码 1 delete删除 delete from table 只是删除了表中的内容 并没有把表删除 2 drop删除 drop table 表名 把整个表都删除 3 truncate删除 truncate t
  • 通用mybatis执行sql工具系列解决方案lingdu

    整套逻辑可执行保存到数据库中的sql例如 select from a where a name ling name ling name中的name是由前端传入的参数 经过Lingdu类的动态封装 传入到mapper xml中的sql字符串中
  • python 处理hbase数据

    使用Python调用happybase库 1 thrift 是facebook开发并开源的一个二进制通讯中间件 通过thrift 我们可以用Python来操作Hbase 首先开启Hadoop平台的HadoopMaster的thrift服务
  • 使用webpack中的externals配置项如何配置

    externals配置项用于配置那些不需要打包进应用程序中的第三方依赖 在webpack配置文件中 可以使用以下方式配置externals module exports externals jquery jQuery 上面的配置表示jque
  • gdb C++程序coredump不显示行号问题

    编译程序的时候加上 g就可以了 编译出来的程序会大不少 然后再去gdb就能显示行号了 直接就能定位到具体那一行导致的程序coredump
  • 虚拟机下为ubuntu添加硬盘

    1 在Vm中关闭Ubuntu 设置 中 添加新的硬件设备 选择Hard Disk 点击下一步 2 选择硬盘类型 可以选择IDE 或是SCSI 这里选择SCSI 3 选择虚拟新硬盘的位置 命名 Ubuntu2 vmdk 4 设定硬盘大小 随便
  • python解带L1正则的最小二乘

    给定 H R d n H in R d times n
  • 存储卡目录变成未知文件?这些技巧能让你恢复数据!

    当存储卡的目录变成未知文件时 我们无法直接访问存储卡中的数据 但是 这并不意味着这些数据永远无法恢复 以下是几种可能恢复存储卡数据的方法 使用数据恢复软件 从互联网上下载并安装专业的数据恢复软件这些软件可以扫描存储卡 找回已删除或损坏的数据
  • 用MATLAB的GUI绘图的一个简单例子

    本文参考自https jingyan baidu com article 0f5fb099ade1626d8334ead0 html 略加改动 常用MATLAB进行一些计算 使用GUI功能的话调整参数的时候会比较方便 首先在MATLAB中选
  • FCA-FineReport帆软认证报表工程师(FCA)考试考题

    Part 1 判断题 总分 60分 得分 56 第1题 判断题 进行决策系统平台目录管理时 链接的地址可以选择使用相对路径或绝对路径 得分 2分 满分 2分 正确答案 A A 正确 B 错误 第2题 判断题 次级管理员可新建 编辑 删除有权
  • 爬虫的“黄金搭档”---requests库的详细介绍

    什么是requests Requests is an elegant an simple HTTP library for Python Requests是一个优雅而简单的HTTP库 requests库是一个常用的用于http请求的模块 它
  • 转发UGUI事件响应

    示例 点击UI时 被遮挡的UI也响应 using System Collections using System Collections Generic using System Linq using UnityEngine using U
  • SQL之DML

    DML Data Manipulation Language 数据操作语言 用来对数据库中表的数据记录进行增删改操作 insert 添加数据 update 修改数据 delete 删除数据 1 给指定字段添加数据 insert into 表
  • SlideLive:基于Elasticsearch Suggester实现搜索框提示功能

    简介 SlideLive网站使用Elasticsearch作为文档的搜索引擎 我们需要在搜索下拉框实现如下三种功能 自动补全 Auto Completion 纠错 热词推荐 ElasticSearch 为我们提供了Suggester功能 可