2016-05-11 15 views
0

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.

+0

Was ist, wenn Ihr Produkt mehr positive Bewertungen und damit mehr als einen Häufigkeitswert zum Vergleich hat? Was dann? –

+0

Korrekt, vergessen zu erwähnen - die Bewertungen ist ein Array. Es gibt auch negative Bewertungen, die der Einfachheit halber weggelassen wurden. – Seffy

+0

Sie bekommen den Punkt nicht: aus dieser Reihe von Werten, welche Frequenz werden Sie in 'reviews.positive.aspects.frequency> Y' vergleichen? –

Antwort

0

Ich bin mir nicht sicher, ob das das einzige Problem ist, aber Versuchen Sie, den verschachtelten Pfad auch zusammen mit dem geschachtelten Filter beim Sortieren zu setzen. Ich habe es vor kurzem zu einem ähnlichen Problem beim Sortieren von Schachtelfeldern ausgeführt.