• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
MC_Hotdog
Yeah, you're right I'm still riding that crappy bike
博客园    首页    新随笔    联系   管理    订阅  订阅

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 

 

posted @ 2019-08-25 20:06  MC_Hotdog  阅读(1083)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3