ES学习记录12.2——短语推荐器(Phrase Suggester)

term推荐器提供了很方便的API基于特定字符串距离去获取可选的建议词,这些API允许单独从这些流中获取标记,然而,通常需要预先选择的推荐以呈现给最终用户,phrase推荐器在term推荐器的基础上添加额外的逻辑去选择完全修正的短语而不是基于ngram-language模式的单独地修正标记,实际上这些推荐器将能够基于共生和频率选出更好的标记。

 总的来说,phrase推荐器需要先前做过映射配置(即结构化数据mapping)的来工作,下面是结构化的过程:

PUT test
{
    "settings": {
        "index": {
            "number_of_shards": 1,
            // 定义2个自定义的分析器
            "analysis": {
                "analyzer": {
                    "trigram": {
                        "type": "custom",
                        "tokenizer": "standard",
                        "filter": ["shingle"]
                    },
                    "reverse": {
                        "type": "custom",
                        "tokenizer": "standard",
                        "filter": ["reverse"]
                    }
                },
                // 定义过滤器
                "filter": {
                    "shingle": {
                        "type": "shingle",
                        "min_shingle_size": 2,
                        "max_shingle_size": 3
                    }
                }
            }
        }
    },
    // 域映射,作结构化数据映射
    "mappings": {
        "_doc": {
            "properties": {
                "title": {
                    "type": "text",
                    "fields": {
                        "trigram": {
                            "type": "text",
                            "analyzer": "trigram"
                        },
                        "reverse": {
                            "type": "text",
                            "analyzer": "reverse"
                        }
                    }
                }
            }
        }
    }
}

// 添加测试数据
POST test/_doc?refresh=true
{"title": "noble warriors"}
POST test/_doc?refresh=true
{"title": "nobel prize"}

一旦设置了分析器和映射,就可以在使用term推荐器了(和phrase推荐器的使用一样),比如:

POST test/_search
{
    "suggest": {
        "text": "noble prize",
        "simple_phrase": {
            "phrase": {
                "field": "title.trigram",
                "size": 1,
                "gram_size": 3,
                "direct_generator": [{
                    "field": "title.trigram",
                    "suggest_mode": "always"
                }],
                "highlight": {
                    "pre_tag": "",
                    "post_tag": ""
                }
            }
        }
    }
}

// 返回的结果为:
{
    "took": 5,
    "timed_out": false,
    "_shards": ...
    "hits": ...
    "suggest": {
        "simple_phrase": [
            {
                "text": "noble prize",
                "offset": 0,
                "length": 11,
                "options": [
                    {
                        "text": "nobel prize",
                        "highlighted": "nobel prize",
                        "score": 0.5962314
                    }
                ]
            }
        ]
    }
}

短语推荐器接口的基本参数有:

  • field:用于作基于语言模式的连词查找字段,这个推荐器将会使用这个字段去获取修正分数的统计数据,这个字段是强制的;
  • gram_size:设置在field中连词的最大数值,如果这个字段不包含连词应该可以被忽略或者直接设置为1,注意ES会尝试基于特定的field字段检测连词的长度,这个字段用了shingle过滤器,如果没有显式指定那它的gram_size将会被设置为max_shingle_size
  • real_word_error_likelihood:表示一个术语被拼错的甚至存在于字典中的可能性,默认是0.95对应于5%是真实单词是拼写错误;
  • confidence:信任级别定义了一个影响为其他推荐词的阈值输入短语分数的因素,只有分数大于阈值的候选词会包含在结果中,比如设置为1.0将会返回分数大于输入短语的推荐词(这也是默认值),如果设置为0将会返回前N个候选词;
  • max_errors:术语(为了形成修正大多数认为拼写错误)的最大百分比,这个参数可以接受[0,1)范围内的小数作为实际查询项的一部分,也可以是大于等于1的绝对数。默认值为1.0,与最多1对应,只有修正拼写错误返回,注意这个参数设置太高将会影响ES性能,推荐使用像1或2这样较小的数值,否则时间花在建议调用可能超过花在查询执行的时间;
  • separator:表示在三目域中用于分隔术语的分隔符,如果没有设置分隔符,那将使用空格字符作为分隔符;
  • size:为每个查询词生成的推荐词的数值,提高这个参数可以提高更高的编辑距离,默认为5;
  • analyzer:分析推荐文本的分析器,默认是通过field使用推荐词的搜索分析器;
  • shard_size:表示从每个独立的碎片获取推荐词的最大数量,在降低阶段,只返回前几个推荐词(具体几个根据size选项),默认是5;
  • text:设置文本以提供推荐词;
  • highlight:设置高亮推荐,如果不提供该参数将不会有返回highlighted字段;如果提供参数,那必须明确包含pre_tagpost_tag标签(用于包裹高亮内容),如果多个标记连续改变整个短语的改变标记包装而不是每个标记;
  • collate:检查每一个推荐词对指定的query删除推荐词不存在匹配文档的索引,推荐词的校对查询仅仅可以在从本地碎片中获取的推荐词的碎片上执行,query参数必须指定,而且它可以被模板化,当前的推荐词可以作为{{suggestion}}自动使用(可以使用在查询中)。你还可以指定自己的模板params——suggestion值将被添加到指定的变量中,此外如果将返回所有推荐短语还可以指定一个prune来控制,当设置为true时推荐词将有一个额外的参数collate_match,如果相应的短语匹配到文档则为true,否则为falseprune默认值是false
POST _search
{
    "suggest": {
        "text": "noble prize",
        "simple_phrase": {
            "phrase": {
                "field": "title.trigram",
                "size": 1,
                "direct_generator": [{
                    "field": "title.trigram",
                    "suggest_mode": "always",
                    "min_word_length": 1
                }],
                "collate": {
                    // 这个查询将为每个推荐都运行一次
                    "query": {
                        "source": {
                            "match": {
                                // 这里 {{suggestion}} 变量将会被每个推荐的文本替换掉
                                "{{field_name}}": "{{suggestion}}"
                            }
                        }
                    },
                    // 在 params 字段中通过 field_name 指定了一个额外变量,这个变量将会在匹配查询中使用
                    "params": {"field_name": "title"},
                    // 指定每个推荐词都返回一个额外的字段 collate_match,表示产生的短语是否匹配到了文档
                    "prune": true
                }
            }
        }
    }
}

平滑化模式

phrase推荐器支持通过多种平滑模型以平衡低频短语(没有出现在索引中的短语)和高频连词(在索引中至少出现过一次)的权重,参数有:

  • stupid_backoff:一个简单的补偿模型,如果高阶数为0和折扣低阶语法模型常数因子,补偿作用将会发挥,默认discount是0.4,stupid_backoff是默认使用的模型;
  • laplace:一个平滑模型,使用额外的平滑将常数添加所有以平衡权重,默认alpha是0.5;
  • linear_interpolation:是一种基于用户提供的权值(lambdas)对一元、二元和三元图取加权平均值的平滑模型,线性插值模式没有提供任何默认值,要使用这种模型必须手动提供所有参数(包括trigram_lambdabigram_lambdaunigram_lambda);

你可能感兴趣的:(#,ES,Elasticsearch)