三:es 搜索建议Suggesters

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提示

text

搜索文本。建议文本是必填选项,需要全局或按建议设置。

field

从中获取候选建议的字段。这是必需选项,需要全局设置或根据建议设置。

analyzer

分析器用来分析建议文本。默认为建议字段的搜索分析器。

size

每个建议文本将返回的最大数。

sort

定义每个建议文本术语应如何分类建议。两个可能的值:

  • score:首先按分数排序,然后记录频次,然后是词条本身。
  • frequency:首先按文档频率排序,然后按相似性得分排序,然后再按术语本身排序。

suggest_mode

提示模式控制要包含的建议,或控制建议的文本术语和建议的控件。可以指定三个可能的值:

  • missing:仅对未在索引中的建议文本术语提供建议。这是默认值。
  • popular:仅建议在比原始建议文本术语更多的文档中出现的建议。
  • always:根据建议文本中的术语建议任何匹配的建议。

lowercase_terms

在文本分析之后,将建议的文本术语小写。

max_edits

最大编辑距离候选建议可以具有以便被认为是建议。只能是1到2之间的值。任何其他值都将导致引发错误的请求错误。默认为2。

prefix_length

必须匹配的最小前缀字符数才能成为建议的候选者。默认值为1。增加此数字可提高拼写检查性能。通常,拼写错误不会出现在学期开始时。(旧名称“ prefix_len”已弃用)

 "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": "",
          "post_tag": ""
        }
      }
    }
  }
}
----------------------------返回
{
  "_shards": ...
  "hits": ...
  "timed_out": false,
  "took": 3,
  "suggest": {
    "simple_phrase" : [
      {
        "text" : "noble prize",
        "offset" : 0,
        "length" : 11,
        "options" : [ {
          "text" : "nobel prize", ------这里
          "highlighted": "nobel 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"
            }
        }
    }
}

 

你可能感兴趣的:(#)