如何利用 Elasticsearch 实现自动补全功能?

Sherwin.Wei Lv8

如何利用 Elasticsearch 实现自动补全功能?

回答重点

为了利用 Elasticsearch 实现自动补全功能,我们可以使用 Completion Suggester。完成步骤如下:

1)建立索引,并在映射中创建一个具有 completion 类型的字段。
2)向索引中添加数据,将需要自动补全的字段内容索引到 completion 字段中。
3)使用 suggest API 进行查询,并通过关键词查询自动补全建议。

具体示例:

1)建立索引:

1
2
3
4
5
6
7
8
9
10
PUT /autocomplete_index
{
"mappings": {
"properties": {
"suggest_field": {
"type": "completion"
}
}
}
}

2)添加文档:

1
2
3
4
5
6
POST /autocomplete_index/_doc/1
{
"suggest_field": {
"input": ["Elasticsearch usage", "Elasticsearch application"]
}
}

3)查询补全建议:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
POST /autocomplete_index/_search
{
"suggest": {
"autocomplete_suggestion": {
"prefix": "Elas",
"completion": {
"field": "suggest_field",
"fuzzy": {
"fuzziness": 2
}
}
}
}
}

以上是实现自动补全的简单步骤。

扩展知识

Elasticsearch 的 Completion Suggester 只是自动补全的一个实现方式,还有一些其他的技巧和方式,以适应不同的使用场景。以下是一些扩展思路:

1)Context Suggester:这是一种增强版的 Completion Suggester,可以根据上下文进行补全,比如地理位置、分类等。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
PUT /context_index
{
"mappings": {
"properties": {
"suggest_field": {
"type": "completion",
"contexts": [
{ "name": "location", "type": "geo", "precision": 5 }
]
}
}
}
}

2)拼写纠错:使用 Term SuggesterPhrase Suggester 来处理拼写错误的自动补全。例如,当用户输入 “elastcisearch” 时,可以建议 “elasticsearch”。

示例:

1
2
3
4
5
6
7
8
9
10
11
POST /_search
{
"suggest": {
"text": "elastcisearch",
"term_suggestion": {
"term": {
"field": "suggest_field"
}
}
}
}

3)自定义权重:可以通过赋予不同的补全词不同的权重来控制建议的优先级。例如,某些词汇比其他词汇更常见。

示例:

1
2
3
4
5
6
7
POST /autocomplete_index/_doc/2
{
"suggest_field": {
"input": ["common term"],
"weight": 10
}
}

4)性能优化:对于大规模的自动补全数据,可以通过分片、合理的缓存策略等手段优化查询性能。在设置索引时,可以考虑合理设置分片和副本。

Comments
On this page
如何利用 Elasticsearch 实现自动补全功能?