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