• 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 

  • 相关阅读:
    ASP.NET编程中非常有用的例子
    打包样式资源
    9.使用类的2个注意点
    面向对象案例
    super必须放到子类this之前
    PHP:根据二维数组中的某个字段进行排序
    Vuex的五个核心属性
    利用按钮控制listview的当前选择项,滚动条跟随动
    c#通过进程名字获取进程路径
    判断客户端是否安装realplayer
  • 原文地址:https://www.cnblogs.com/Alexephor/p/11408446.html
Copyright © 2020-2023  润新知