Я использую ES 1.7.2, вот мое отображение:Elasticsearch условно/вложенная сортировка
{
"template":"products*",
"mappings":{
"Product":{
"dynamic":"false",
"properties":{
"id":{
"type":"long"
},
"name":{
"type":"string",
"analyzer":"standard"
},
"score":{
"type":"double"
},
"reviews":{
"type":"nested",
"dynamic":"false",
"properties":{
"positive":{
"type":"nested",
"dynamic":"false",
"properties":{
"reviewCount":{
"type":"integer"
},
"quote":{
"type":"string",
"analyzer":"standard"
},
"aspects":{
"type":"nested",
"dynamic":"false",
"properties":{
"id":{
"type":"long"
},
"name":{
"type":"string",
"analyzer":"standard"
},
"score":{
"type":"double"
},
"frequency":{
"type":"integer"
}
}
}
}
}
}
}
}
}
}
}
Я хотел бы, чтобы закодировать запрос это будет соответствовать продуктам, которые содержат конкретные reviews.positive.aspects.id
с score
выше, чем X, и результаты будут отсортированы по этому значению score
, если reviews.positive.aspects.frequency
выше Y в противном случае сортировать по reviews.positive.aspects.frequency
. Я пытался сделать следующее, но ничего хорошего:
RangeFilterBuilder productScoreFilter = rangeFilter("score").from(productScore).includeLower(true);
QueryBuilder productScoreQuery = filteredQuery(matchAllQuery(), andFilter(productScoreFilter));
client.prepareSearch("products").
setQuery(productScoreQuery).
setSize(resultsCount).
addSort(fieldSort("score").order(SortOrder.DESC).setNestedFilter(rangeFilter("reviews.positive.aspects.frequency").gte("50"))).
setSearchType(SearchType.QUERY_THEN_FETCH).
get();
Но результаты не отсортированы по своему усмотрению. От чтения вокруг я думаю, что я должен использовать сортировку на основе скриптов, но я не уверен, как это работает с вложенной сортировкой. Любая помощь приветствуется.
Спасибо.
Что делать, если ваш продукт имеет более положительные отзывы и, следовательно, более одного значения частоты для сравнения? Что тогда? –
Правильно, забыл упомянуть - обзоры - это массив. Есть также негативные отзывы, опущенные для простоты. – Seffy
Вы не понимаете: из этого массива значений, какую частоту вы собираетесь сравнивать в 'reviews.positive.aspects.frequency> Y'? –