Whew, after much experimentation and hours of trawling the Interweb I finally managed to get the desired behavior! (Full credit goes to Clinton Gormley.)
Mapping configuration:
mappings:
title: { boost: 8 }
summary: { boost: 5 }
text: { boost: 3 }
author:
publishedAt: { type: date }
Here is the code using the PHP client, Elastica, to dynamically build the query to boost using the original mapping AND the published date:
$query = new Elastica_Query_Bool();
$query->addMust(new Elastica_Query_QueryString($queryString));
$ranges = array();
for ($i = 1; $i <= 5; $i++) {
$date = new DateTime("-$i month");
$currentRange = new Elastica_Query_Range();
$currentRange->addField('publishedAt', array(
'boost' => (6 - $i),
'gte' => $date->getTimestamp()
));
$ranges[] = $currentRange->toArray();
}
$query->addShould($ranges);
/** @var $pagerfanta Pagerfanta */
$pagerfanta = $this->getFinder()->findPaginated($query);
And for those of you more interested in the raw elasticsearch query (only with 3 date ranges for brevity)...
curl -XPOST 'http://localhost:9200/website/story/_search?pretty=true' -d '
{
"query" : {
"bool" : {
"must" : {
query_string: {
query: "<search term(s)>"
}
},
"should" : [
{
"range" : {
"publishedAt" : {
"boost" : 5,
"gte" : "<1 month ago>"
}
}
},
{
"range" : {
"publishedAt" : {
"boost" : 4,
"gte" : "<2 months ago>"
}
}
},
{
"range" : {
"publishedAt" : {
"boost" : 3,
"gte" : "<3 months ago>"
}
}
}
]
}
}
}'
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…