2016-05-11 4 views
0

Я использую 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(); 

Но результаты не отсортированы по своему усмотрению. От чтения вокруг я думаю, что я должен использовать сортировку на основе скриптов, но я не уверен, как это работает с вложенной сортировкой. Любая помощь приветствуется.

Спасибо.

+0

Что делать, если ваш продукт имеет более положительные отзывы и, следовательно, более одного значения частоты для сравнения? Что тогда? –

+0

Правильно, забыл упомянуть - обзоры - это массив. Есть также негативные отзывы, опущенные для простоты. – Seffy

+0

Вы не понимаете: из этого массива значений, какую частоту вы собираетесь сравнивать в 'reviews.positive.aspects.frequency> Y'? –

ответ

0

Я не уверен Если это единственная проблема, но попробуйте установить вложенный путь также вместе с вложенным фильтром при сортировке. Я недавно применил его к подобной проблеме при сортировке по вложенным полям.

Смежные вопросы