在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`,你可以實現拼寫糾錯、短語建議、自動補全和上下文過濾等功能。根據具體需求選擇合適的建議類型,可以顯著提升搜索的準確性和效率。