Elasticsearch条件/嵌套排序

时间:2016-05-11 09:14:37

标签: java elasticsearch

我正在使用ES 1.7.2,这是我的映射:

{
   "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.idscore高于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();

但结果并没有按照我的意愿排序。从阅读中我认为我应该使用基于脚本的排序,但我不确定它如何与嵌套排序一起使用。任何帮助表示赞赏。

感谢。

1 个答案:

答案 0 :(得分:0)

我不确定如果这是唯一的问题,请在排序时尝试设置嵌套路径以及嵌套过滤器。我最近在通过嵌套字段排序时将其运行到类似的问题。