{ "label_all": [ "fist", "poing", "hand", "poignet"... ], "labels" : { "label_en" : ["fist", "hand"] // First is always the label, "label_fr" : ["poing", "poignet"], }, // Maybe not needed "aliases" : { "alias_en": [ "hand" ], "alias_fr" : [ "poignet" ], } } labels_all: { "properties": { "near_match": "case insentive, accent insensitive" "exact_match": "case sensitive, accent sensitive" (maybe not needed) "prefix": "case insensitive, accenten insensitive" } }, labels: { "label_en": { "properties": { "near_match": "case insentive, accent insensitive"(maybe not needed???) "exact_match": "case sensitive, accent sensitive" (maybe not needed) "prefix": "case insensitive, accenten insensitive" } } } I'm ht, searching for poignet FILTER { labels_all.prefix:poignet } SHOULD DISMAX{ // DISMAX allows to keep only the best score and not not additive scoring of all the matches // Might be easier when it comes to combine this score to query independent factors labels_all.exact_match:poignet^10 labels_all.near_match:poignet^5 labels_ht.exact_match:poignet^100 labels_ht.near_match:poignet^50 labels_ht.prefix:poignet^25 labels_fr.exact_match:poignet^75 labels_fr.near_match:poignet^40 labels_fr.prefix:poignet^15 labels_en.exact_match:poignet^50 labels_en.near_match:poignet^25 labels_en.prefix:poignet^10 # specific alias query should not be needed if they are part of the label field aliases_ht.exact_match:poignet^100 aliases_ht.near_match:poignet^50 aliases_ht.prefix:poignet^25 aliases_fr.exact_match:poignet^75 aliases_fr.near_match:poignet^40 aliases_fr.prefix:poignet^15 aliases_en.exact_match:poignet^50 aliases_en.near_match:poignet^25 aliases_en.prefix:poignet^10 } + rescoring with query independant factors (sitelink...)