ElasticSearch 搜索建议 suggest

7.7文档
1.Suggesters 建议
提示功能通过使用提示,根据提供的文本提示外观相似的术语。

建议请求部分在_search请求中与查询部分一起定义。如果查询部分被忽略,则仅返回建议。

每个请求可以指定几个建议。每个建议都以任意名称标识。在下面的示例中,提出了两个建议。 my-suggest-1和my-suggest-2建议都使用术语“建议者”,但文字不同。

POST _search
{
  "suggest": {
    "my-suggest-1" : {
      "text" : "tring out Elasticsearch",
      "term" : {
        "field" : "message"
      }
    },
    "my-suggest-2" : {
      "text" : "kmichy",
      "term" : {
        "field" : "user"
      }
    }
  }
}


为了避免重复建议文本,可以定义全局文本。在下面的示例中,建议文本是全局定义的,并且适用于my-suggest-1和my-suggest-2建议。

POST _search
{
  "suggest": {
    "text" : "tring out Elasticsearch",
    "my-suggest-1" : {
      "term" : {
        "field" : "message"
      }
    },
    "my-suggest-2" : {
       "term" : {
        "field" : "user"
       }
    }
  }
}


以下建议响应示例包括对my-suggest-1和my-suggest-2的建议响应。每个建议部分都包含条目。
每个条目实际上是来自建议文本的标记,并且包含建议条目文本,建议文本中的原始起始偏移量和长度以及(如果找到)任意数量的选项。

"suggest": {
    "my-suggest-1": [ {
      "text": "tring",
      "offset": 0,
      "length": 5,
      "options": [ {"text": "trying", "score": 0.8, "freq": 1 } ]
    }, {
      "text": "out",
      "offset": 6,
      "length": 3,
      "options": []
    }.....


每个选项数组都包含一个选项对象,该选项对象包含建议文本,其文档频率和与建议输入文本相比的得分。分数的含义取决于所使用的建议者。推荐者一词的得分是基于编辑距离的

2.Term suggester term提示

 "suggest" : { <!-- 定义建议查询 -->
    "my-suggestion" : { <!-- 一个建议查询名 -->
      "text" : "tring out Elasticsearch", <!-- 查询文本 -->
      "term" : { <!-- 使用词项建议器 -->
        "field" : "message" <!-- 指定在哪个字段上获取建议词 -->
      }
    }
  }
3.Phrase Suggester 词组提示 
   通常,短语建议者需要预先进行特殊映射才能工作。此页面上的短语建议者示例需要以下映射才能起作用。反向分析器仅在最后一个示例中使用。

PUT test
{
  "settings": {
    "index": {
      "number_of_shards": 1,
      "analysis": {
        "analyzer": {
          "trigram": {
            "type": "custom",
            "tokenizer": "standard",
            "filter": ["shingle"]
          },
          "reverse": {
            "type": "custom",
            "tokenizer": "standard",
            "filter": ["reverse"]
          }
        },
        "filter": {
          "shingle": {
            "type": "shingle",
            "min_shingle_size": 2,
            "max_shingle_size": 3
          }
        }
      }
    }
  },
  "mappings": {
    "_doc": {
      "properties": {
        "title": {
          "type": "text",
          "fields": {
            "trigram": {
              "type": "text",
              "analyzer": "trigram"
            },
            "reverse": {
              "type": "text",
              "analyzer": "reverse"
            }
          }
        }
      }
    }
  }
}
POST test/_doc?refresh=true
{"title": "noble warriors"}
POST test/_doc?refresh=true
{"title": "nobel prize"}


 
设置完分析器和映射后,就可以在使用术语“建议者”的地方使用“建议者”一词:

POST test/_search
{
  "suggest": {
    "text": "noble prize",
    "simple_phrase": {
      "phrase": {
        "field": "title.trigram",
        "size": 1,
        "gram_size": 3,
        "direct_generator": [ {
          "field": "title.trigram",
          "suggest_mode": "always"
        } ],
        "highlight": {
          "pre_tag": "<em>",
          "post_tag": "</em>"
        }
      }
    }
  }
}
----------------------------返回
{
  "_shards": ...
  "hits": ...
  "timed_out": false,
  "took": 3,
  "suggest": {
    "simple_phrase" : [
      {
        "text" : "noble prize",
        "offset" : 0,
        "length" : 11,
        "options" : [ {
          "text" : "nobel prize", ------这里
          "highlighted": "<em>nobel</em> prize",
          "score" : 0.5962314
        }]
      }
    ]
  }
}


 4.Completion Suggester 完成提示器
java代码可以参考:案例传送门

关联文章:HighLevelRestClient操作suggest

完成提示器提供自动完成/按需搜索功能。这是一个导航功能,可在用户键入内容时指导他们获得相关结果,从而提高搜索精度。它并不用于拼写纠正或“您是否要说”功能,例如术语或短语建议者。

理想情况下,自动完成功能应与用户键入的速度一样快,以提供与用户已经键入的内容相关的即时反馈。因此,完成建议器的速度得到了优化。建议程序使用的数据结构可实现快速查找,但构建成本很高,并且存储在内存中。

要使用此功能,请为此字段指定一个特殊的映射,该映射将为快速完成的字段值编制索引。

PUT music
{
    "mappings": {
        "_doc" : {
            "properties" : {
                "suggest" : {
                    "type" : "completion"
                },
                "title" : {
                    "type": "keyword"
                }
            }
        }
    }
}
-----------------------------------
 
PUT /news_website
{
  "mappings": {
    "news" : {
      "properties" : {
        "title" : {
          "type": "text",
          "analyzer": "ik_max_word",
          "fields": {    // mapping的多字段使用方式
            "suggest" : {
              "type" : "completion",
              "analyzer": "ik_max_word"
            }
          }
        },
        "content": {
          "type": "text",
          "analyzer": "ik_max_word"
        }
      }
    }
  }
----------------------------------------------------


您可以像其他字段一样为建议编制索引。建议由输入和可选的权重属性组成。输入是建议查询将与之匹配的预期文本,权重决定了建议的评分方式。索引建议如下:

PUT music/_doc/1?refresh
{
    "suggest" : [
        {
            "input": "Nevermind",
            "weight" : 10
        },
        {
            "input": "Nirvana",
            "weight" : 3
        }
    ]
}


映射支持以下参数:
analyzer

要使用的索引分析器,默认为simple。

search_analyzer

要使用的搜索分析器,默认值为analyzer。

preserve_separators

保留分隔符,默认为true。如果禁用,Foo Fighters则建议您以开头的字段foof。

preserve_position_increments

启用位置增量,默认为true。如果禁用并且使用停用词分析器The Beatles,则建议您输入以开头的字段b。注意:您也可以通过索引两个输入Beatles和来 实现此目的The Beatles,如果您能够丰富自己的数据,则无需更改简单的分析器。

max_input_length

限制单个输入的长度,默认为50UTF-16代码点。此限制仅在索引时间使用,以减少每个输入字符串的字符总数,以防止大量输入使基础数据结构膨胀。大多数用例不会受到默认值的影响,因为前缀补全很少会超出前缀而不会少于几个字符。

建议与往常一样工作,除了必须将建议类型指定为完成。建议几乎是实时的,这意味着可以通过刷新使新建议可见,并且一旦删除就不会显示文档。这个请求:

POST music/_search?pretty
{
    "suggest": {
        "song-suggest" : {
            "prefix" : "nir",          用于搜索建议的前缀 
            "completion" : {           建议类型 
                "field" : "suggest"  在其中搜索建议的字段名称
            }
        }
    }
}
--------------------------返回-------
 "took": 2,
  "timed_out": false,
  "suggest": {
    "song-suggest" : [ {
      "text" : "nir",
      "offset" : 0,
      "length" : 3,
      "options" : [ {
        "text" : "Nirvana",
        "_index": "music",
        "_type": "_doc",
        "_id": "1",
        "_score": 1.0,
        "_source": {
          "suggest": ["Nevermind", "Nirvana"]
        }
      } ]
    } ]
  }
}


基本完成建议程序查询支持以下参数:
field

在其上运行查询的字段的名称(必填)。

size

要返回的建议数(默认为5)。

skip_duplicates

是否应过滤掉重复的建议(默认为false)。

4.1 Skip duplicate suggestions 过滤重复 
过滤:查询可以返回来自不同文档的重复建议。通过将skip_duplicates设置为true,可以修改此行为。设置后,此选项从结果中过滤出带有重复建议的文档。

POST music/_search?pretty
{
    "suggest": {
        "song-suggest" : {
            "prefix" : "nor",
            "completion" : {
                "field" : "suggest",
                "skip_duplicates": true
            }
        }
    }
}


   4.2 Fuzzy queries 模糊查询
模糊:完成建议器还支持模糊查询-这意味着您可以在输入中输入错误,并且仍然可以得到结果。

POST music/_search?pretty
{
    "suggest": {
        "song-suggest" : {
            "prefix" : "nor",
            "completion" : {
                "field" : "suggest",
                "fuzzy" : {
                    "fuzziness" : 2
                }
            }
        }
    }
}


  

fuzziness

模糊因子,默认为AUTO。有关允许的设置,请参见 模糊性

transpositions

如果设置为true,则换位计为一次更改而不是两次更改,默认为true

min_length

返回模糊建议之前的最小输入长度,默认 3

prefix_length

输入的最小长度(不检查模糊替代项)默认为 1

unicode_aware

如果为true,则所有度量(如模糊编辑距离,换位和长度)均以Unicode代码点而不是以字节为单位。这比原始字节略慢,因此false默认情况下将其设置为。

正则:完成提示器还支持正则表达式查询,这意味着您可以将前缀表示为正则表达式

POST music/_search?pretty
{
    "suggest": {
        "song-suggest" : {
            "regex" : "n[ever|i]r",
            "completion" : {
                "field" : "suggest"
            }
        }
    }
}


 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值