У меня возникли досадные проблемы при попытке заставить function_score работать для поля цены. Первоначально я пытался использовать поле scaled_float. Однако это не понравилось. Поэтому я изменил свое ценовое поле на длинное с отступом для десятичной позиции. Таким образом, у меня есть поле с "15000" для $ 150,00.
Вот мой запрос к / products_v7 / product / _search
{
"explain":true,
"query":{
"function_score":{
"query":{
"bool":{
"should":[
{
"match_phrase":{
"title":{
"query":"test",
"slop":10
}
}
}
]
}
},
"functions":[
{
"gauss":{
"price":{
"origin":"15000",
"scale":"2000"
}
},
"weight":2
}
]
}
}
}
Вот ответ
{
"error": {
"root_cause": [
{
"type": "parsing_exception",
"reason": "unknown field [price]",
"line": 1,
"col": 0
}
],
"type": "search_phase_execution_exception",
"reason": "all shards failed",
"phase": "query",
"grouped": true,
"failed_shards": [
{
"shard": 0,
"index": "products_v7",
"node": "cd3yjjoSSxKxaJ-vCB8SgQ",
"reason": {
"type": "parsing_exception",
"reason": "unknown field [price]",
"line": 1,
"col": 0
}
}
]
},
"status": 400
}
Отображение для / products_v7 / product / _mapping
{
"products_v7": {
"mappings": {
"product": {
"properties": {
"price:": {
"type": "long"
},
"sku": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"title": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
}
}
Вот данные, которые я вставил в
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 1,
"hits": [
{
"_index": "products_v7",
"_type": "product",
"_id": "cSULBGMBog6d8NyO0gRH",
"_score": 1,
"_source": {
"sku": "126",
"title": "test 4",
"price:": 15000
}
},
{
"_index": "products_v7",
"_type": "product",
"_id": "fl0FBGMBog0jN_eMK89-",
"_score": 1,
"_source": {
"sku": "125",
"title": "test 3",
"price:": 13000
}
}
]
}
}