这是一个系列的第六篇,这篇介绍了如何让我们的搜索引擎在用户输入一部分搜索关键字的同时,给用户提供搜索词建议。

目录

什么是搜索词建议

搜索词建议是现代搜索引擎一个非常重要的功能,当用户在搜索栏里面输入一部分字的时候,搜索引擎就会给出建议,如下图:

google_suggestion

搜索词建议有两个优点:

  1. 对用户来说,减少用户的输入。
  2. 对搜索引擎来说,增加用户输入的准确性,从而增加返回结果的准确性。

接下来我们看一下如何加入这个功能。

使用搜索词建议

对于用户的输入,我们应当显示什么样的提示,是和我们的产品业务息息相关的。假设我们现在是一个外卖App,当用户搜索的时候,我们的提示词一定会从所有外卖的名字里面搜索,而不会去搜索外卖的描述。而当用户真正执行了搜索这个行为之后,我们才会去搜索名字和描述里面,是否含有用户输入的关键词。

在我们现在的fgo数据库例子中,我们希望达成如下效果:
用户输入“阿”,我们要返回用户“阿尔托莉雅・潘德拉贡”作为搜索词建议。

我们要达到该效果可以用两种方法。

  1. 每当用户输入字符,我们执行一遍搜索,返回搜索结果。
  2. ES内置了一个叫Suggester的东西,我们使用Suggester来返回搜索结果。

第一种方式,即时搜索

这种方式所采用的技术没什么新鲜的,我们都已经掌握了。具体流程如下:

  1. 用户在网页的搜索栏上面输入“阿”
  2. 我们网页前端的JavaScript代码中,监听keyUp事件,每当该事件响应,我们获取搜索栏的词向ES服务器发送搜索请求。
  3. ES服务器返回搜索结果,我们显示在前端页面上。
  4. 当用户点击该建议词的时候,我们将该词作为最终搜索词,重新进行搜索,并返回搜索结果。

具体代码如下(和之前的搜索差不多):

1
2
3
4
5
6
7
8
9
GET /fgo/_search
{
"query": {
"match": {
"name": "阿"
}
},
"_source": "name"
}

这里多加了一个”_source”:”name”,代表我们不需要把文档的其他字段返回,只需要返回name字段即可。

返回如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
"took": 35,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.95465237,
"hits": [
{
"_index": "fgo",
"_type": "servant",
"_id": "1",
"_score": 0.95465237,
"_source": {
"name": "阿尔托莉雅・潘德拉贡"
}
}
]
}
}

然后我们只要把hits.hits数组里面每一项的_source.name返回给用户即可。

第二种方式,Suggester

ES的Suggester的用处有几种:

  1. 纠正用户拼错的词。例如我们数据库里面,class(职阶)里面有saber,如果用户输入了sabew,Suggester可以返回saber。
  2. 自动补全。这个和我们第一种方式的结果是差不多的。

Suggester的分类

Suggester一共有四种:

  1. Term suggester
  2. Phrase Suggester
  3. Completion Suggester
  4. Context Suggester

Term suggester就是你输入把你的输入以一个个term的形式来分析,并返回你建议。就像上面的例子,接受用户输入的sabew,返回saber,属于term suggester。

Phrase Suggester更高级一点,他会以词组为单位返回建议。例如用户输入了noble prize,其实是拼错了,phrase suggester会返回nobel prize。

Completion Suggester提供了自动补全功能,但是设置挺复杂,这里不再展开。

Context Suggester是Completion Suggester的一个补充。Completion Suggester会去考虑index里面所有的documents。但是有时候,你想要先筛选掉一部分数据,或者是让某些字段重要性更高一点。这时候,可以使用Context Suggester。

因为本系列目标是搜索引擎的入门,所以在这里不做过多展开。关于Suggester的文档可见:Suggesters | Elasticsearch Reference [5.2] | Elastic

另外,中文的suggester要有更多的一些设置和调整,具体可以看这篇文章。What are the best approach for Chinese/Japanese language indexing and searching? - Elasticsearch - Discuss the Elastic Stack

接下来,我们看一下boosting功能,用来将某些字段的搜索优先级提高。


题图来源:Designed by Freepik

ElasticSearch官方教程:点此进入
Kibana官方教程:点此进入