建议器功能
对用户搜索的内容做纠正帮助用户搜索到精确度高的关键字
搜索关键字的时候做出补全的功能
建议器种类
词条建议器(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