2013-12-04 5 views
1

У меня есть index с именем books, который имеет reviews как object, который может обрабатывать массивы. При получении данных в конкретном случае мне нужен только review, имеющий максимум rating.Извлечь только один объект внутри массива elasticsearch

"books" :{ 
    "reviews": { 
     "properties": { 
      "rating": { 
       "type": "float" 
      }, 
      "comments": { 
       "type": "string" 
      } 
     } 
    }, 
    "author" : { 
     "type" : "string" 
    } 
} 

Многие книги могут иметь много reviews каждый из которых имеет некоторые rating. Для конкретного случая использования я хочу, чтобы в результирующем наборе был только reviews, имеющий максимум rating. Мне нужно построить поиск query для такого результата.

POST books/_search 
{ 
    "size": 51, 

    "sort": [ 
    { 
     "reviews.rating": { 
     "order": "asc", 
     "mode" : "min" 
     } 
    } 
], 
"fields": [ 
    "reviews","author"] 
} 

С помощью script_fields можно построить динамический fields но не objects. Иначе я мог бы сделать динамический объект reviews, имеющий одно поле rating, а другое как comment.

+0

Я не вижу способ сделать это с помощью статистической фаской. Я неправильно понял ваш вопрос и подумал, что вам нужен максимальный рейтинг по всем книгам. Поэтому я удалил свой ответ. –

ответ

2

script_fields могут быть использованы для создания как динамических полей и объектов:

curl -XDELETE localhost:9200/test-idx 
curl -XPUT localhost:9200/test-idx -d '{ 
    "mappings": { 
     "books" :{ 
      "reviews": { 
       "properties": { 
        "rating": { 
         "type": "float" 
        }, 
        "comments": { 
         "type": "string" 
        } 
       } 
      }, 
      "author" : { 
       "type" : "string" 
      } 
     } 
    } 
}' 

curl -XPOST "localhost:9200/test-idx/books?refresh=true" -d '{ 
    "reviews": [{ 
     "rating": 5.5, 
     "comments": "So-so" 
    }, { 
     "rating": 9.8, 
     "comments": "Awesome" 
    }, { 
     "rating": 1.2, 
     "comments": "Awful" 
    }], 
    "author": "Roversial, Cont" 
}' 

curl "localhost:9200/test-idx/books/_search?pretty" -d '{ 
    "fields": ["author"], 
    "script_fields": { 
     "highest_review": { 
      "script": "max_rating = 0.0; max_review = null; for(review : _source[\"reviews\"]) { if (review.rating > max_rating) { max_review = review; max_rating = review.rating;}} max_review" 
     } 
    } 
}' 
+0

не ожидал ответа. Также нашел это поздно .. многое. – user2512324

Смежные вопросы