[英]Elastic Search autocomplete/ partial matching for combines fields
我在车辆索引中有我的数据:
{
"mappings": {
"properties": {
"@timestamp": {
"type": "date"
},
"@version": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"engine": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"make": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"model": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"year": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
我正在开发搜索功能,用户可以使用来自 ElasticSearch 的自动建议进行搜索。 目前我正在使用以下查询:
{
"query": {
"multi_match": {
"query" : "2014 Iko",
"fields": [
"make",
"model",
"year",
"engine"
],
"operator": "and"
}
}
}
通过上面的查询,如果我输入整个单词,我就可以搜索结果。 例如,如果用户搜索福特野马,它会返回所有可能的结果(年份和发动机变化),以福特和野马作为模型的组合。 问题:问题是当用户搜索“Ford Musta”时,弹性搜索结果为 0 个结果。 在这种情况下,我希望将福特作为品牌和 Musta 作为型号、年份或引擎的短语的所有选项。
搜索可以按任何顺序进行,因此我们希望支持用户搜索 Mustang Ford 和其他可能的顺序。
非常感谢!!
如果你想使用自动完成,你不能使用关键字。 您需要使用不同的映射(=> es 需要以不同的方式索引数据)。
如果您想在“模型”和“引擎”上使用自动完成功能,我会加入映射。 如果需要,添加其他字段,或将它们保留为关键字。
注意:这显然会在您的 es 集群上占用更多资源。 注意2:您将不得不重新索引您的数据,看看 _reindex 功能,如果您有任何问题,请咨询我们。
{
'settings': {
"analysis":{
"filter":{
"name_ngrams":{
"max_gram":"20",
"type":"edge_ngram",
"min_gram":"1",
"side":"front"
}
},
"analyzer":{
"partial_name":{
"type":"custom",
"filter":[
"lowercase",
"name_ngrams",
"asciifolding"
],
"tokenizer":"standard"
},
"full_name":{
"type":"custom",
"filter":[
"lowercase",
"asciifolding"
],
"tokenizer":"standard"
}
}
}
},
"mappings":{
"properties":{
"model":{
"type":"text",
"analyzer":"partial_name",
"search_analyzer":"full_name"
},
"engine":{
"type":"text",
"analyzer":"partial_name",
"search_analyzer":"full_name"
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.