Ich verwende ES 1.7.2, hier mein Mapping ist:Elasticsearch bedingte/verschachtelte Sortierung
{
"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"
}
}
}
}
}
}
}
}
}
}
}
Ich mag eine Abfrage codieren diese Produkte entsprechen wird, die bestimmten reviews.positive.aspects.id
mit score
höher als X enthalten, und die Ergebnisse werden nach score
sortiert, wenn reviews.positive.aspects.frequency
höher als Y ist, andernfalls nach reviews.positive.aspects.frequency
sortieren. Ich habe Folgendes versucht, aber nicht gut:
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();
Aber Ergebnisse sind nicht so sortiert, wie ich es wünsche. Ich denke, dass ich beim Lesen von Skripts eine scriptbasierte Sortierung verwenden sollte, aber ich bin mir nicht sicher, wie das mit verschachtelter Sortierung funktioniert. Jede Hilfe wird geschätzt.
Danke.
Was ist, wenn Ihr Produkt mehr positive Bewertungen und damit mehr als einen Häufigkeitswert zum Vergleich hat? Was dann? –
Korrekt, vergessen zu erwähnen - die Bewertungen ist ein Array. Es gibt auch negative Bewertungen, die der Einfachheit halber weggelassen wurden. – Seffy
Sie bekommen den Punkt nicht: aus dieser Reihe von Werten, welche Frequenz werden Sie in 'reviews.positive.aspects.frequency> Y' vergleichen? –