概念
term suggest提供一个非常方便的API,用于在一定的字符串距离内按每个令牌访问单词替代。API允许单独访问流中的每个令牌,而建议选择则留给API使用者。然而,为了向最终用户提出建议,往往需要预先选定的建议。
创建索引mapping
一旦你设置了分析器和映射,你就可以在同一个地方使用短语建议器
PUT test
{
"mappings": {
"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"}
一旦你设置了分析器和映射,你就可以在同一个地方使用暗示器这个短语:
建议查询
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": "<em>",
"post_tag": "</em>"
}
}
}
}
}
响应结果
响应包含建议,由最有可能的拼写纠正首先评分。在这种情况下,我们得到了预期修正“nobel prize”。
{
"_shards": ...
"hits": ...
"timed_out": false,
"took": 3,
"suggest": {
"simple_phrase" : [
{
"text" : "noble prize",
"offset" : 0,
"length" : 11,
"options" : [ {
"text" : "nobel prize",
"highlighted": "<em>nobel</em> prize",
"score" : 0.48614594
}]
}
]
}
}
扩展
下面的示例显示了使用两个生成器的短语建议调用:第一个使用了包含普通索引术语的字段,第二个使用了使用反向过滤器索引的术语的字段(令牌是倒序索引的)。这是用来克服直接生成器需要一个常量前缀来提供高性能建议的限制。pre_filter和post_filter选项接受普通的分析器名称。
POST test/_search
{
"suggest": {
"text" : "obel prize",
"simple_phrase" : {
"phrase" : {
"field" : "title.trigram",
"size" : 1,
"direct_generator" : [
{
"field" : "title.trigram",
"suggest_mode" : "always"
},
{
"field" : "title.reverse",
"suggest_mode" : "always",
"pre_filter" : "reverse",
"post_filter" : "reverse"
}
]
}
}
}
}
pre_filter和post_filter也可以用于在生成候选对象之后注入同义词。例如,对于查询队长usq,我们可以为术语usq生成一个候选usa,它是america的同义词。如果这句话的得分足够高,我们就可以向用户呈现captain america。