我正在使用下面的代码,当我输入“cu”时,它并没有给出自动建议作为curd。
但它确实与酸奶相匹配,这是正确的。如何实现同义词词的自动完成和相同的文档匹配?
PUT products
{
"settings": {
"index": {
"analysis": {
"analyzer": {
"synonym_analyzer": {
"tokenizer": "standard",
"filter": [
"lowercase",
"synonym_graph"
]
}
},
"filter": {
"synonym_graph": {
"type": "synonym_graph",
"synonyms": [
"yogurt, curd, dahi"
]
}
}
}
}
}
}PUT products/_mapping
{
"properties": {
"description": {
"type": "text",
"analyzer": "synonym_analyzer"
}
}
}POST products/_doc
{
"description": "yogurt"
}GET products/_search
{
"query": {
"match": {
"description": "cu"
}
}
}发布于 2021-03-06 09:43:28
当您在synonym_graph过滤器中提供同义词列表时,它仅仅意味着ES将交替地对待任何同义词。但是当通过分析器对它们进行分析时,只有全词标记 将产生
POST products/_analyze?filter_path=tokens.token
{
"text": "yogurt",
"field": "description"
}屈服:
{
"tokens" : [
{
"token" : "curd"
},
{
"token" : "dahi"
},
{
"token" : "yogurt"
}
]
}因此,常规的match_query不会在这里剪切它,因为标准分析器没有为它提供足够的可匹配子字符串(N克)上下文。
同时,您可以将match替换为match_phrase_prefix,这完全是您所追求的--匹配一个有序的字符序列,同时考虑到同义词:
GET products/_search
{
"query": {
"match_phrase_prefix": {
"description": "cu"
}
}
}但是,正如查询名称所暗示的那样,这只适用于前缀。如果您想要一个建议术语的自动完成,而不管子字符串匹配发生在哪里,,请看我的另一个答案--i 谈谈如何利用n-g。
https://stackoverflow.com/questions/66497829
复制相似问题