在涉及ElasticSearch的用法时,我是一个相对新手。
目前,我正在尝试设置自动完成功能,以便在我们的应用中搜索用户名,但是我遇到了一个问题,完成建议器没有给我预期的结果。这是我最初映射属性的方式。
'properties' : {
'username' : {
'type' : 'keyword',
'fields' : {
'text' : {
'type' : 'text'
},
'suggest' : {
'type' : 'completion'
}
}
}
}
用户名仅限于大写的字母数字字符。 (0-9,A-Z,没有空白)
我遇到的问题是,由于默认的simple
分析器,精确匹配TIM的加权与3TIM相同。但是看看标准分析器,至少根据this看来,只有空格之间的文字被标记化了。
我可以通过在username.suggest字段上指定标准tokenizer来预期我的预期行为吗?或者我是否尝试完全错误,我应该使用完全不同的分析器和edge_ngrams?
使用completion
字段类型时,通常不需要使用任何edge-ngram,这就是completion
字段在内部执行的操作。
但是,你是对的,simple
分析器默认用于completion
类型,它会丢弃所有数字,即只要它遇到一个不是字母的字符就会分割输入。因此,只有当您的数据只有[a-zA-Z]时才会起作用,这不是您的情况。
由于您的输入只包含一个令牌用户名,因此您可以使用standard
分析器。如果有多个令牌,我会因为停用词令牌过滤器而阻止您使用它,但由于情况并非如此,您可以安全地使用它。
如果您必须在多令牌输入上使用完成,通常最有效的方法是创建一个custom
分析器,其中包含whitespace
或classic
标记器和lowercase
标记过滤器,如下所示:
"suggest_analyzer": {
"type": "custom",
"tokenizer": "classic",
"filter": [
"lowercase"
]
},
您的里程可能会有所不同,但上述分析仪是您可以建立的良好基础。