2015-08-31 4 views
1

отображения базы данных заключается в следующем:ElasticSearch уровня 2 ведра сортировка

{ 
    "users": { 
     "mappings": { 
     "user": { 
      "properties": { 
       credentials": { 
        "type": "nested", 
        "properties": { 
        "achievement_id": { 
         "type": "string" 
        }, 
        "percentage_completion": { 
         "type": "integer" 
        } 
        } 
       }, 
       "current_location": { 
        "type": "geo_point" 
       }, 
      "locations": { 
       "type": "geo_point" 
     } 
      } 
     } 
     } 
    } 

Теперь в отображении, Вы можете видеть, что есть два поля гео-заочных одно CURRENT_LOCATION и другое расположение. Теперь я хочу сортировать пользователя на основе credentials.percentage_completion, который является вложенным полем. Это отлично работает, например, этот запрос, Пример запрос:

GET /users/user/_search?size=23 
{ 
    "sort": [ 
    { 
     "credentials.percentage_completion": { 
     "order": "desc", 
     "missing": "_last" 
     } 
    }, 
"_score" 
    ], 
    "query": { 
    "filtered": { 
     "query": { 
     "match_all": {} 
     }, 
     "filter": { 
     "geo_distance": { 
      "distance": "100000000km", 
      "user.locations": { 
      "lat": 19.77, 
      "lon": 73 
      } 
     } 
     } 
    } 
    } 
} 

Я хочу, чтобы изменить порядок сортировки производится в ведро, желаемый порядок первого показать все человек, которые находятся в радиусе 100 км user.current_location и сортировать их в соответствии с credentials.percentage_completion, а затем остальные пользователи отсортированы снова с помощью credentials.percentage_completion.

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

Я думал, что могу использовать _score для сортировки и более релевантного для людей, которые находятся под 1000 км, но гео-расстояние - это фильтр, я, похоже, не нашел способа уделить внимание фильтру.

Есть ли что-нибудь, что мне не хватает здесь, любая помощь будет замечательной.

Благодаря

ответ

1

Наконец решил ее, отправляя его здесь, так что другие могут также взять немного свинца, если они получают здесь. Способ решения этого вопроса - дать постоянную оценку соответствия конкретному запросу, но поскольку здесь это было расстояние Geo, поэтому он не смог использовать это в запросе, тогда я нашел Constant Score query: он позволяет обернуть фильтр внутри запроса.

Вот как выглядит запрос:

GET /users/user/_search?size=23 
{ 
    "sort": [ 
    "_score", 
    { 
     "credentials.udacity_percentage_completion": { 
     "order": "desc", 
     "missing": "_last" 
     } 
    } 
    ], 
    "explain": true, 
    "query": { 
    "filtered": { 
     "query": { 
     "bool": { 
      "should": [ 
      { 
       "constant_score": { 
       "filter": { 
        "geo_distance": { 
        "distance": "100km", 
        "user.current_location": { 
         "lat": 19.77, 
         "lon": 73 
        } 
        } 
       }, 
       "boost": 50 
       } 
      }, 
      { 
       "constant_score": { 
       "filter": { 
        "geo_distance": { 
        "distance": "1000000km", 
        "user.locations": { 
         "lat": 19.77, 
         "lon": 73 
        } 
        } 
       }, 
       "boost": 1 
       } 
      } 
      ] 
     } 
     }, 
     "filter": { 
     "geo_distance": { 
      "distance": "10000km", 
      "user.locations": { 
      "lat": 19.77, 
      "lon": 73 
      } 
     } 
     } 
    } 
    } 
} 
Смежные вопросы