您好我正在尝试设置一个搜索框,可以对某些字段进行部分搜索,对其他字段进行标准搜索。我快到了,但未能克服以下障碍:
这是我的索引:
PUT /my_index
{
"mappings": {
"blogpost": {
"properties": {
"firstname": {
"fields": {
"autocomplete": {
"index_analyzer": "autocomplete",
"type": "string"
},
"firstname": {
"index_analyzer": "standard",
"type": "string"
}
},
"type": "string"
}
}
}
},
"settings": {
"index": {
"analysis": {
"analyzer": {
"autocomplete": {
"tokenizer": "ngram_tokenizer",
"type": "custom"
},
"standard": {
"type": "standard"
}
},
"tokenizer": {
"ngram_tokenizer": {
"max_gram": "20",
"min_gram": "2",
"type": "nGram"
}
}
},
"creation_date": "1431690991641",
"number_of_replicas": "0",
"number_of_shards": "3",
"uuid": "W4Ug6IadS9mYuN5_Pqlhow",
"version": {
"created": "1040499"
}
}
}
}
索引1文件:
PUT /my_index/blogpost/1
{"firstname" : "Albert"}
简单查询:
/_search?q=Albert
返回艾伯特。一切都好。
Multi_match查询:
{
"query": {
"multi_match": {
"query": "Albert",
"fields": [
"firstname",
"firstname.autocomplete"
]
}
}
}
也回归艾伯特。一切都好。
如果我用伯特取代阿尔伯特,那就回归艾伯特。一切都好。
但是" Al"或" al"或者" Alber"或" alber"才不是!任何包含开头字母的搜索都会失败。
然而
/my_index/_search?firstname.autocomplete:Al
一切都很好。
请帮忙。
答案 0 :(得分:4)
field.autocomplete的搜索分析器是默认值,通常是standard。
因此,当您搜索Al时,您实际上正在寻找“al”,即使是“Al”,您最终也会搜索小写版本。
然而,在使用自动完成分析器进行索引时,您没有将数据规范化为小写,因此索引中只有术语“Al”。
您可以使用analyze api检查数据的分析方式
GET /my_index/_analyze?field=firstname.autocomplete&text=Albert"
将lowercase token filter添加到“自动填充”分析器应解决此问题:
"autocomplete": {
"tokenizer": "ngram_tokenizer",
"type": "custom",
"filter" :[
"lowercase"
]
},