官网解释
原理:将输入的文本分解为Token,然后在索引的字典里查找相似的Term并返回
根据使用场景不同,有4中类别的Suggesters:
Term Suggester
- 每个建议都包含了一个算分。实现建议算法的核心是想是一个词改动多少字符就可以和另外一个词一致。提供了很多可选参数来控制相似性的模糊程度。例如“max_edits”
- 集中Suggestion Mode
- Missing:如索引已经存在,就不提供建议
- Popular:推荐出现频率更高的词
- Always:无论是否存在,都提供建议
POST accounts/_search
{
"query": {
"match": {
"address": "Street 880"
}
},
"suggest": {
"term_sugg": {
"text": "Street 880",
"term": {
"suggest_mode": "always",
"field": "address"
}
}
}
}
Phrase Suggester
- 在Term Suggester上增加了一些额外的逻辑
- 一些参数
- Suggester Mode:missing,popular,always
- Max Errors:最多可以拼错的Terms数
- Confidence:限制返回接过数,默认为1
POST accountData/_search
{
"suggest": {
"YOUR_SUGGESTION": {
"text": " madion Stre2t ",
"phrase": {
"field": "address",
"max_errors": 2,
"confidence": 2,
"highlight":{
"pre_tag":"<em>",
"post_tag":"</em>"
}
}
}
}
}
Completion Suggester - 自动补全
- Completion Suggester 提供了自动完成的功能。用户每输入一个字符,就需要即时发送一个查询请求到后端查找匹配项
- 对性能要求比较苛刻。Elasticsearch采用了不同的数据结构,并非通过倒排索引来完成。而是将Analyze的数据编码成FST和索引一起存放。FST会被ES整个加载进内存,速度很快
- FST只能用户前缀查找
// 1. 搜索字段类型定义为completion
PUT article
{
"mappings": {
"properties": {
"title_completion": {
"type": "completion"
}
}
}
}
// 2. 检索
POST article/_search?pretty
{
"size": 0,
"suggest": {
"ARTICLE_SUGGESTION": {
"prefix": "el",
"completion":{
"field": "title_completion"
}
}
}
}
Context Suggester - 基于上下文的提示
- 可以定义两种类型的Context
- Category-任意的字符串
- Geo-地理位置信息
// 1.定义mapping
PUT comments/_mapping
{
"properties":{
"comment_autocomplete":{
"type": "completion",
"contexts":[{
"type": "category",
"name": "comment_category"
}]
}
}
}
// 2.索引数据
// movies上下文,提示star wars
POST comments/_doc
{
"commennt": "I love the star war movies",
"comment_autocomplete":{
"input":["star wars"],
"contexts":{
"comment_category": "movies"
}
}
}
// coffee上下文,提示starbucks
POST comments/_doc
{
"commennt": "Where can i find a Starbucks",
"comment_autocomplete":{
"input":["starbucks"],
"contexts":{
"comment_category": "coffee"
}
}
}
// 3. 检索
POST comments/_search
{
"suggest": {
"comments_SUGGESTION": {
"prefix":"star",
"completion":{
"field":"comment_autocomplete",
"contexts":{
"comment_category":"coffee"
}
}
}
}
}
- 可以定义两种类型的Context