我是靠谱客的博主 漂亮电话,最近开发中收集的这篇文章主要介绍Elasticsearch之建议器suggester,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

建议器功能

  对用户搜索的内容做纠正帮助用户搜索到精确度高的关键字

  搜索关键字的时候做出补全的功能

建议器种类

  词条建议器(term suggester)

  词组建议器(phrase suggester)

  完成建议器 (completion suggester)

  上下文建议器(context suggester)

term suggester

 功能:主要做纠正 但是是短语就不能做了(分析后)

PUT s1
{
"mappings": {
"doc":{
"properties": {
"title":{
"type":"text",
"analyzer":"standard"
}
}
}
}
}
PUT s1/doc/1
{
"title": "Lucene is cool"
}
PUT s1/doc/2
{
"title": "Elasticsearch builds on top of lucene"
}
GET s1/doc/_search
{
"query": {
"match": {
"title": "lucene"
}
},
"suggest": {
"my_s1": {
"text": "lucne",
"term": {
"field": "title"
}
}
}
}
GET s1/doc/_search
{
"suggest": {
"my_s2": {
"text": "lucne",
"term": {
"field": "title"
}
},
"my_s3":{
"text":"lune",
"term":{
"field":"title"
}
}
}
}
GET s1/doc/_search
{
"suggest": {
"text": "lucne",
"my_s4": {
"term": {
"field": "title"
}
},
"my_s5":{
"term":{
"field":"title"
}
}
}
}

 建议器字段

 1 text:建议文本,建议文本是必需的选项,可以通过全局(多个建议器中查询相同的内容)或者按照单个建议器的格式来。
 2 field:从field字段中获取候选建议的字段。这是一个必需的选项,需要全局设置或根据建议设置。
 3 analyzer:用于分析建议文本的分析器。默认为建议字段的搜索分析器。
 4 size:个建议文本标记返回的最大条目。
 5 sort:定义如何根据建议文本术语对建议进行排序。它有两个可能的值。
 6   score,先按分数排序,然后按文档频率排序,再按术语本身排序。
 7   frequency,首先按文档频率排序,然后按相似性分数排序,然后按术语本身排序。也可以理解为按照流行度排序。
 8 suggest_mode:控制建议的模式,有3个模式可选择。
 9   missing,仅为不在索引中的建议文本术语提供建议。这是默认值。
10   popular,仅建议在比原始建议文本术语更多的文档中出现的建议。也就是说提供比原有输入词频更高的词条
11   always,根据建议文本中的条款建议任何匹配的建议。说白了就是无论如何都会提供建议。
12 lowercase_terms:在文本分析之后降低建议文本术语的大小写。
13 min_word_length:建议文本术语必须具有的最小长度才能包含在内。默认为4.(旧名称min_word_len已弃用)。
14 shard_size:设置从每个单独分片中检索的最大建议数。在减少阶段,仅根据size选项返回前N个建议。默认为该 size选项。将此值设置为高于该值的值size可能非常有用,以便以性能为代价获得更准确的拼写更正文档频率。由于术语在分片之间被划分,因此拼写校正频率的分片级文档可能不准确。增加这些将使这些文档频率更精确。
15 max_inspections:用于乘以的因子, shards_size以便在碎片级别上检查更多候选拼写更正。可以以性能为代价提高准确性。默认为5。
16 string_distance:用于比较类似建议术语的字符串距离实现。
17   internal,默认值基于damerau_levenshtein,但高度优化用于比较索引中术语的字符串距离。
18   damerau_levenshtein,基于Damerau-Levenshtein算法的字符串距离算法。
19   levenshtein,基于Levenshtein编辑距离算法的字符串距离算法。
20   jaro_winkler,基于Jaro-Winkler算法的字符串距离算法。
21   ngram,基于字符n-gram的字符串距离算法。

 phrase suggester

   适合较长的字段,但是也不是万能的  做纠正

GET s1/doc/_search
{
"suggest": {
"my_s6": {
"text": "lucne is cool",
"phrase": {
"field": "title"
}
}
}
}
DELETE s2
PUT s2
{
"mappings": {
"doc": {
"properties": {
"title": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}
}
PUT s2/doc/1
{
"title": "Lucene is cool"
}
PUT s2/doc/2
{
"title": "Elasticsearch builds on top of lucene"
}
PUT s2/doc/3
{
"title": "Elasticsearch rocks"
}
PUT s2/doc/4
{
"title": "Elastic is the company behind ELK stack"
}
PUT s2/doc/5
{
"title": "elk rocks"
}
PUT s2/doc/6
{
"title": "elasticsearch is rock solid"
}
GET s2/doc/_search
{
"suggest": {
"my_s1": {
"text": "lucne and elasticsear rock",
"phrase": {
"field": "title",
"highlight":{
"pre_tag":"<em class='xxxx'>",
"post_tag":"</em>"
}
}
}
}
} 

 completion suggester

   速度要快  输入的内容立即返回  对字段类型要求多节省存储空间  时间复杂度O(1),做建议不做纠错

PUT s5
{
"mappings": {
"doc":{
"properties":{
"title":{
"type":"completion",
"analyzer":"ik_smart"
}
}
}
}
}
PUT s5/doc/1
{
"title":"Lucene is cool"
}
PUT s5/doc/2
{
"title":"Elasticsearch builds on top of lucene"
}
PUT s5/doc/3
{
"title":"Elasticsearch rocks"
}
PUT s5/doc/4
{
"title":"Elastic is the company behind ELK stack"
}
PUT s5/doc/5
{
"title":"the elk stack rocks"
}
PUT s5/doc/6
{
"title":"elasticsearch is rock solid"
}
GET s5/doc/_search
{
"suggest": {
"my_s5": {
"text": "elas",
"completion": {
"field": "title"
}
}
}
}

特殊映射中支持的参数

1 analyzer,要使用的索引分析器,默认为simple。
2 search_analyzer,要使用的搜索分析器,默认值为analyzer。
3 preserve_separators,保留分隔符,默认为true。 如果您禁用,您可以找到以Foo Fighters开头的字段,如果您建议使用foof。
4 preserve_position_increments,启用位置增量,默认为true。如果禁用并使用停用词分析器The Beatles,如果您建议,可以从一个字段开始b。注意:您还可以通过索引两个输入来实现此目的,Beatles并且 The Beatles,如果您能够丰富数据,则无需更改简单的分析器。
5 max_input_length,限制单个输入的长度,默认为50UTF-16代码点。此限制仅在索引时使用,以减少每个输入字符串的字符总数,以防止大量输入膨胀基础数据结构。大多数用例不受默认值的影响,因为前缀完成很少超过前缀长于少数几个字符。

建议映射还可以定义在已存在索引字段的多字段

PUT s6
{
"mappings": {
"doc": {
"properties": {
"name": {
"type": "text",
"fields": {
"suggest": {
"type": "completion"
}
}
}
}
}
}
}
PUT s6/doc/1
{
"name":"KFC"
}
PUT s6/doc/2
{
"name":"kfc"
}
GET s6/doc/_search
{
"suggest": {
"my_s6": {
"text": "K",
"completion": {
"field": "name.suggest"
}
}
}
}

 在索引阶段提升相关性

   在索引字段中加建议 并且分析的时候关键字搜索的时候也是关键字

PUT s7
{
"mappings": {
"doc":{
"properties":{
"name":{
"type":"text",
"fields":{
"suggest":{
"type":"completion",
"analyzer":"keyword",
"search_analyzer":"keyword"
}
}
}
}
}
}
}
PUT s7/doc/1
{
"name":"KFC"
}
PUT s7/doc/2
{
"name":"kfc"
}
GET s7/doc/_search
{
"suggest": {
"my_s7": {
"text": "K",
"completion": {
"field": "name.suggest"
}
}
}
}

  权重与输入框

PUT s8
{
"mappings": {
"doc":{
"properties":{
"title":{
"type": "completion"
}
}
}
}
}
PUT s8/doc/1
{
"title":{
"input":"blow",
"weight": 2
}
}
PUT s8/doc/2
{
"title":{
"input":"block",
"weight": 3
}
}
GET s8/doc/_search
{
"suggest": {
"s3": {
"text": "bl",
"completion": {
"field": "title"
}
}
}
}
PUT s8/doc/3
{
"title": [
{
"input":"appel",
"weight": 2
},
{
"input":"apple",
"weight": 3
}
]
}
PUT s8/doc/4
{
"title": ["apple", "appel", "block", "blow"],
"weght": 32
}
GET s8/doc/_search
{
"suggest": {
"s4": {
"text": "app",
"completion": {
"field": "title"
}
}
}
}

在搜索阶段提升相关性

GET s8/doc/_search
{
"suggest": {
"my_s9": {
"text": "blaw",
"completion": {
"field": "title",
"size": 2,
"fuzzy": {
"fuzziness": 2,
"min_length": 3,
"prefix_length": 2
}
}
}
}
}

  返回指定字段_source  size返回2条  skip_duplicates过滤掉重复牺牲了一些性能

GET s8/doc/_search
{
"suggest": {
"completion_suggest": {
"text": "appl",
"completion": {
"field": "title",
"size":2,
"skip_duplicates":true
}
}
},
"_source": "title"
}

  正则

GET s5/doc/_search
{
"suggest": {
"completion_suggest": {
"regex": "e[l|e]a",
"completion": {
"field": "title"
}
}
}
}

 

更多关注https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters.html 

 

转载于:https://www.cnblogs.com/Alexephor/p/11408446.html

最后

以上就是漂亮电话为你收集整理的Elasticsearch之建议器suggester的全部内容,希望文章能够帮你解决Elasticsearch之建议器suggester所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部