ES中如何实现带有数字的精准前缀匹配?

在使用ES进行前缀匹配时,尤其是类似于搜索联想词这种场景的时候,经常会需要进行文本的前缀匹配优先展示。但是当词条本身包含数字的时候,就会出现下面的情况:
当你搜索“建国路5”的时候,完整的词条“建国路58号”是不被返回的,而当你输入“建国路58”的时候,词条才能被召回。
这是为什么呢?如何才能实现,只输入第一个数字的时候,词条就可以被召回呢?
已邀请:

zkbhj - 凯冰科技站长

赞同来自:

在使用ES来实现联想词场景时,我们经常使用的前缀匹配查询语法如下:
"query":
{
"match_phrase_prefix": {
"address.keyword":{
"query": "建国路5"
}
}
}
但如果没有对相应的字段进行分词器的指定,就会出现问题里描述的状况。
 
解决方法一:通过调整max_expansions参数来使其能够返回,但缺点是影响性能
"query":
{
"match_phrase_prefix": {
"address.keyword":{
"query": "建国路5",
"max_expansions": 500
}
}
}

方法二:通过分词器ngram来结局
PUT suggestion/_settings
{
"index": {
"analysis": {
"analyzer": {
"cngram": {
"type": "custom",
"tokenizer": "my_tokenizer"
}
},
"tokenizer": {
"my_tokenizer": {
"type": "ngram",
"min_gram": 1,
"max_gram": 1,
"token_chars": [
"letter",
"digit"
]
}
},
"filter": {
"shingle": {
"type": "shingle",
"min_shingle_size": 2,
"max_shingle_size": 3
}
}
}
}
}
"mappings": {
"_doc": {
"properties": {
"address" : {

"type":"completion",
"analyzer":"cngram",
        "preserve_separators" : true,
        "preserve_position_increments" : true,
        "max_input_length" : 50
}
}
}
}
GET gesuggestion/_search
{
"query":
{
"match_phrase_prefix": {
"address":"建国路5"
}
}
}
[size=13]
[/size]

要回复问题请先登录注册