[英]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.