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

SlideLive:基于Elasticsearch Suggester实现搜索框提示功能,第1张

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

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: 分享和发现知识

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5688871.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存