【Elasticsearch】suggest
在Elasticsearch中,`suggest` 是一个非常强大的功能,用于实现自动补全、拼写纠错和模糊搜索等功能。它可以帮助用户更快地找到他们想要的内容,同时提升搜索体验。以下是关于 `suggest` 的详细使用方法和常见场景。
1\. Suggest 的基本概念
`suggest` 是一个查询组件,通常与搜索请求一起发送。它可以根据用户的输入提供相关的建议,帮助用户更快速地完成搜索。`suggest` 支持多种类型,包括:
- Term Suggest(拼写纠错):用于纠正用户输入中的拼写错误。
- Phrase Suggest(短语建议):基于上下文提供完整的短语建议。
- Completion Suggest(自动补全):用于实现自动补全功能,通常用于搜索框中的实时建议。
- Context Suggest(上下文建议):结合上下文信息(如分类、标签等)提供更精准的建议。
2\. Term Suggest(拼写纠错)
`term suggest` 是一种基于用户输入的拼写纠错功能。它会根据索引中的数据,找出最接近的正确拼写。
示例
假设我们有一个索引 `products`,其中包含以下文档:
```json
{
"product_name": "Apple iPhone 13"
}
{
"product_name": "Samsung Galaxy S21"
}
```
如果用户输入了一个拼写错误的查询,例如 `iphne`,我们可以使用 `term suggest` 来纠正拼写:
```json
POST /products/_search
{
"suggest": {
"product-suggest": {
"text": "iphne",
"term": {
"field": "product_name"
}
}
}
}
```
返回结果可能如下:
```json
{
"suggest": {
"product-suggest": [
{
"text": "iphne",
"offset": 0,
"length": 5,
"options": [
{
"text": "iphone",
"score": 0.8,
"freq": 1
}
]
}
]
}
}
```
3\. Phrase Suggest(短语建议)
`phrase suggest` 可以根据用户的输入提供完整的短语建议。它通常用于纠正拼写错误并提供更自然的短语。
示例
假设用户输入了 `galax s21`,我们可以使用 `phrase suggest` 来提供更准确的短语建议:
```json
POST /products/_search
{
"suggest": {
"product-suggest": {
"text": "galax s21",
"phrase": {
"field": "product_name",
"size": 1
}
}
}
}
```
返回结果可能如下:
```json
{
"suggest": {
"product-suggest": [
{
"text": "galax s21",
"offset": 0,
"length": 10,
"options": [
{
"text": "Samsung Galaxy S21",
"score": 0.9,
"collate_match": true
}
]
}
]
}
}
```
4\. Completion Suggest(自动补全)
`completion suggest` 是实现自动补全功能的最常用方式。它通常用于搜索框中的实时建议。
示例
首先,我们需要在索引中定义一个 `completion` 类型的字段。例如:
```json
PUT /products
{
"mappings": {
"properties": {
"suggest_field": {
"type": "completion"
}
}
}
}
```
然后,插入一些数据:
```json
POST /products/_doc/1
{
"suggest_field": "Apple iPhone 13"
}
POST /products/_doc/2
{
"suggest_field": "Samsung Galaxy S21"
}
```
接下来,使用 `completion suggest` 提供自动补全建议:
```json
POST /products/_search
{
"suggest": {
"product-suggest": {
"prefix": "iph",
"completion": {
"field": "suggest_field"
}
}
}
}
```
返回结果可能如下:
```json
{
"suggest": {
"product-suggest": [
{
"text": "iph",
"offset": 0,
"length": 3,
"options": [
{
"text": "Apple iPhone 13",
"score": 1.0
}
]
}
]
}
}
```
5\. Context Suggest(上下文建议)
`context suggest` 可以结合上下文信息(如分类、标签等)提供更精准的建议。
示例
假设我们有一个带有上下文的索引:
```json
PUT /products
{
"mappings": {
"properties": {
"suggest_field": {
"type": "completion",
"contexts": {
"category": {
"type": "category"
}
}
}
}
}
}
```
插入数据时,指定上下文:
```json
POST /products/_doc/1
{
"suggest_field": {
"input": "Apple iPhone 13",
"contexts": {
"category": "electronics"
}
}
}
POST /products/_doc/2
{
"suggest_field": {
"input": "Samsung Galaxy S21",
"contexts": {
"category": "electronics"
}
}
}
```
查询时,指定上下文:
```json
POST /products/_search
{
"suggest": {
"product-suggest": {
"prefix": "iph",
"completion": {
"field": "suggest_field",
"contexts": {
"category": "electronics"
}
}
}
}
}
```
返回结果会根据上下文过滤,只返回与 `electronics` 类别相关的建议。
6\. 总结
`suggest` 是Elasticsearch中用于提升用户体验的强大工具。通过 `term suggest`、`phrase suggest`、`completion suggest` 和 `context suggest`,你可以实现拼写纠错、短语建议、自动补全和上下文过滤等功能。根据具体需求选择合适的建议类型,可以显著提升搜索的准确性和效率。