我使用ES 1.7.2进行了以下映射,' reviews.positive.aspects'是一个嵌套数组:
{
"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"
}
}
}
}
}
}
}
}
}
}
}
我尝试设置查询以匹配得分高于X的文档,aspect.score高于Y,aspects.id等于Z,结果按aspects.frequency排序。我使用的是FunctionScoreQuery,但结果中的所有分数都是0.这是我的代码:
AndFilterBuilder aspectFilter = andFilter( termFilter( "reviews.positive.aspects.id", aspectId ), rangeFilter( "reviews.positive.aspects.score" ).from( aspectScore ).includeLower( true ) );
NestedFilterBuilder nestedAspectFilter = nestedFilter( "reviews.positive.aspects", filteredQuery( matchAllQuery(), aspectFilter ) );
RangeFilterBuilder productScoreFilter = rangeFilter( "score" ).from( productScore ).includeLower( true );
QueryBuilder productScoreQuery = filteredQuery( matchAllQuery(), andFilter( productScoreFilter ) );
QueryBuilder aspectScoreQuery = QueryBuilders.nestedQuery( "reviews", filteredQuery( matchAllQuery(), nestedAspectFilter ) );
String inlineScript = "doc['reviews.positive.aspects.frequency'].value";
ScoreFunctionBuilder sfb = ScoreFunctionBuilders.scriptFunction( inlineScript, "groovy" );
FunctionScoreQueryBuilder functionScore = QueryBuilders.functionScoreQuery( boolQuery().must( productScoreQuery ).must( aspectScoreQuery ), nestedAspectFilter, sfb );
client.prepareSearch( "products" ).
setQuery( functionScore ).
addSort( SortBuilders.scoreSort().order( SortOrder.DESC) ).
setSearchType( SearchType.QUERY_THEN_FETCH ).
get();
解释如下(类似于所有文档):
0.0 = (MATCH) function score, product of:
0.0 = (MATCH) Math.min of
0.0 = script score function, computed with script:"doc['reviews.positive.aspects.frequency'].value
1.4142135 = _score:
1.4142135 = (MATCH) sum of:
0.70710677 = (MATCH) ConstantScore(+cache(score:[8.0 TO *]) , product of:
1.0 = boost
0.70710677 = queryNorm
0.70710677 = (MATCH) Score based on child doc range from 110571 to 110598
3.4028235E38 = maxBoost
1.0 = queryBoost
结果中的文档确实与过滤条件匹配,但未排序(并且得分为0)。你能指导我如何修复代码吗?
谢谢!