本文字数:4683字,阅读大约需要 17 分钟。
我们在进行搜索的时候,一般都会要求具有“搜索推荐”或者叫“搜索补全”的功能,即在用户输入搜索的过程中,进行自动补全或者纠错,以此来提高搜索文档的匹配精准度,进而提升用户的搜索体验,这就是Suggest。
ES针对不同的应用场景,把Suggester主要分为以下四种:
Tern Suggester
,Phrase Suggester
,Completion Suggester
,Context Suggester
意如其名,Term Suggester针对单独term的搜索推荐,不考虑搜索短语中多个term的关系。
请求示例模版:
POST <index>/_search
{
"suggest": {
"<suggest_name>": {
"text": "<search_content>",
"term": {
"suggest_mode": "<suggest_mode>",
"field": "<field_name>"
}
}
}
}
以下是一个具体的示例,演示如何使用 Term Suggester 进行搜索建议:
POST my_index/_search
{
"suggest": {
"my-suggestion": {
"text": "bown",
"term": {
"suggest_mode": "popular",
"field": "title"
}
}
}
}
在这个示例中,我们发送了一个建议请求,要求根据用户输入的文本 "bown"
提供搜索建议。建议器将在 title
字段中查找匹配项,并提供最受欢迎的建议结果。
min_word_length
参数,可以过滤掉那些长度不足的词项,从而得到更具有意义和相关性的建议结果。min_doc_freq
参数,可以过滤掉那些在文档中出现频率较低的词项,从而得到更具有代表性和相关性的建议结果。max_term_freq
参数,可以控制建议结果中词项的重复出现程度,以避免过多重复的词项。Phrase Suggester 是 Elasticsearch 中用于短语级别建议的功能。它可以根据用户输入的文本生成相关的短语建议,帮助用户补全或纠正输入。
Term Suggester可以对单个term进行建议或者纠错,但是不会考虑多个term之间的关系,Phrase Suggester在Term Suggester的基础上,会去考虑多个term之间的关系,比如是否同时出现在一个索引原文中,相邻程度以及词频等等。
以下是一个使用 Phrase Suggester 的请求示例模板:
POST <index>/_search
{
"suggest": {
"<suggest_name>": {
"text": "<search_content>",
"phrase": {
"field": "<field_name>",
"gram_size": <gram_size>,
"direct_generator": [
{
"field": "<field_name>",
"suggest_mode": "<suggest_mode>"
}
]
}
}
}
}
以下是一个具体的示例,演示如何使用 Phrase Suggester 进行短语建议:
POST my_index/_search
{
"suggest": {
"my-suggestion": {
"text": "quik brwn",
"phrase": {
"field": "title",
"gram_size": 2,
"direct_generator": [
{
"field": "title",
"suggest_mode": "popular"
}
]
}
}
}
}
在这个示例中,我们发送了一个建议请求,要求根据用户输入的文本 "quik brwn"
提供短语建议。Phrase Suggester 将在 title
字段中查找与短语相关的建议结果。
生成短语时,使用的 gram 大小为 2,表示使用两个连续的词项进行组合。而直接生成器(direct_generator)将根据最受欢迎或最频繁出现的词项生成建议结果。
Completion Suggester 是一种用于实现自动补全功能的建议器。它基于预定义的文本片段,为用户提供与输入文本匹配的建议。
Completion Suggester 支持三种查询:前缀查询(prefix),模糊查询(fuzzy),正则表达式查询(regex)。
Completion Suggester也是最常使用的Suggester。
主要针对的应用场景就是"Auto Completion"。 此场景下用户每输入一个字符的时候,就需要即时发送一次查询请求到后端查找匹配项,在用户输入速度较高的情况下对后端响应速度要求比较苛刻。
因此实现上它和前面两个Suggester采用了不同的数据结构。
索引并非通过倒排来完成,而是将analyze过的数据编码成FST和索引一起存放,对于一个open状态的索引,FST会被ES整个装载到内存里的,进行前缀查找速度极快。但是FST只能用于前缀查找,这也是Completion Suggester的局限所在
使用Completion Suggester需要注意以下两点:
Completion Suggester 需要对字段进行特定的映射来支持自动补全功能。以下是为使用 Completion Suggester 所需的映射配置:
以下是一个示例映射配置:
{
"mappings": {
"properties": {
"suggestion_field": {
"type": "completion",
"analyzer": "simple",
"search_analyzer": "simple"
}
}
}
}
请注意,Completion Suggester 只能在专门为自动补全而设计的字段上使用。它不适用于常规的文本字段。
以下是一个使用 Completion Suggester 的请求示例模板:
POST <index>/_search
{
"suggest": {
"<suggest_name>": {
"prefix": "<search_content>",
"completion": {
"field": "<field_name>"
}
}
}
}
以下是一个具体的示例,演示如何使用 Completion Suggester 进行自动完成建议:
POST my_index/_search
{
"suggest": {
"my-suggestion": {
"prefix": "th",
"completion": {
"field": "title_suggest"
}
}
}
}
在这个示例中,我们发送了一个建议请求,要求根据用户输入的前缀 "th"
提供自动完成建议。Completion Suggester 将在 title_suggest
字段中查找与前缀匹配的建议结果。
Context Suggester允许在生成建议时考虑额外的上下文信息。与 Completion Suggester 不同,Context Suggester 可以根据特定的上下文条件来过滤和排序建议结果。
Context Suggester是建立在Completion Suggester基础之上的,可以看成是Completion Suggester的一种补充。
Context Suggester 支持两种类型的上下文:
Context Suggester 中,有几个重要的参数可以用来指定上下文条件和设置建议行为。下面是一些常用的参数:
"category"
或 "geo"
,分别表示分类标签上下文和地理位置上下文。请求示例:
POST /my-index/_search
{
"suggest": {
"my-suggestion": {
"prefix": "Pro",
"completion": {
"field": "suggestions",
"context": {
"category": {
"path": "category.sub_category"
}
}
}
}
}
}
在上述示例中,我们向索引 my-index
发送了一个搜索请求,并使用了 Context Suggester。
field
参数设置为 "suggestions"
,表示要从该字段中获取建议。context.path
参数设置为 "category.sub_category"
,表示要从文档的 category.sub_category
字段中提取上下文信息。这样,Context Suggester 将根据搜索的前缀和上下文信息生成相应的建议结果。
通过这些参数,可以配置 Context Suggester 来满足特定的需求。例如,可以定义多个不同的上下文条件,并为每个上下文条件指定不同的权重,以影响建议结果的排序顺序。还可以使用 path 参数来处理嵌套对象中的上下文条件。
当使用 Context Suggester 时,可以通过以下请求示例向 Elasticsearch 插入文档:
POST /my-index/_doc/1
{
"title": "Product 1",
"suggestions": [
{
"input": "Product 1",
"weight": 10,
"contexts": {
"category": ["electronics"],
"location": ["New York"]
}
},
{
"input": "Phone",
"weight": 5,
"contexts": {
"category": ["electronics", "communication"],
"location": ["Seattle"]
}
}
]
}
这个请求用于向名为 "my-index" 的索引插入一篇文档。该文档的ID是 "1",包含了一个 "title" 字段和一个 "suggestions" 字段。
"suggestions" 字段是一个数组,其中包含了两个建议项。每个建议项都有一个 "input" 属性表示建议的文本,一个可选的 "weight" 属性表示权重值,以及一个 "contexts" 对象表示建议的上下文信息。
具体解释如下:
接下来,让我给出一个关于如何发送请求并获取响应的示例:
请求:
POST /my-index/_search
{
"suggest": {
"my-suggestion": {
"prefix": "Pro",
"completion": {
"field": "suggestions",
"context": {
"category": "electronics",
"location": "New York"
}
}
}
}
}
在上述示例中,我们发送了一个搜索请求,并指定了一个自定义的建议器名称 "my-suggestion"
。我们设置了前缀为 "Pro"
,并在 completion
参数中指定了要使用的字段名和上下文信息。
响应:
{
"suggest": {
"my-suggestion": [
{
"text": "Pro",
"offset": 0,
"length": 3,
"options": [
{
"text": "Product 1",
"_index": "my-index",
"_type": "_doc",
"_id": "1",
"_score": 10,
"_source": {
"title": "Product 1"
},
"contexts": {
"category": ["electronics"],
"location": ["New York"]
}
}
]
}
]
}
}
在响应结果中,将看到根据输入前缀 "Pro"
检索到的一个建议项。该建议项具有文本、偏移量、长度等属性,并包含相关的元数据,如源文档的信息和上下文信息。
点在看,让更多看见。
·················END·················