2013-08-08 2 views
1

Мои текущие документы имеют схожую структуру с:Как можно сортировать по значению «вложенной» Хэш в Elasticsearch

{ 
    'name': 'Sum Guy', 
    'age': 31, 
    'scores': {'blue': 5, 'yellow': 9, 'red': 2} 
} 

Я не могу показаться, чтобы найти правильное отображение или способ сортировать.
В результате я хотел бы, чтобы это «Покажи мне все человек старше 30 лет и сортирую их по„синему“счету»

Nested documents всегда кажется массивы, а не только простой хэш.

Любые идеи?

+0

Это прочитало, помогло прояснить ситуацию: http://euphonious-intuition.com/2013/02/managing-relations-in-elasticsearch/ –

ответ

2

Если это ваша структура документа, вам не нужен вложенный документ. Вы можете просто сортировать по scores.blue.

Точка вложенного документа равна, если у вас есть массив объектов. Если ваша структура была что-то вроде этого:

{ 
'name' : 'Sum Guy', 
'age' : 31, 
'scores' : [{ 
    'name' : 'blue', 
    'count' : 5 
    }, { 
    'name' : 'yellow', 
    'count' : 9 
    } 
} 
] 
} 

Тогда вы бы нужны «баллы», чтобы быть вложенным типом. Когда у вас есть такой массив, значения имен и счетчиков будут сплющены на верхнем уровне. Затем поиск чего-то, поскольку «люди старше 30 лет, где синий больше 5», не приведут к правильным результатам, если вы не определите его как вложенное, а затем каждый объект в массиве фактически является отдельным документом, поэтому контекст зарезервирован.

+0

При попытке этого у меня получилось: «Parse Failure [Не найдено сопоставления для [scores.blue], чтобы сортировать]]. Я был бы счастлив добавить картографию, но я не совсем уверен, какой она должна быть. «score»: { «type»: «integer» } не кажется правильным, так как это хэш со строковыми клавишами и целыми значениями за этим ключом «оценка». –

+0

Какое у вас есть картографирование? Причина, по которой вам не нужно самостоятельно определять отображение, ES создает динамическое сопоставление. И если вы индексировать документ, как вы указали, следующий поиск делает работу: '{ "запрос": { "match_all": {}} , "сорт": [{ "scores.blue":" asc " } ] }' –

+0

У меня есть большое сопоставление, но ничего для этого поля (пока). Я сам определяю это, чтобы не случайно вставлять опечатки и устанавливать индексирование на «not_analyzed». Я действительно не знаю, какое отображение мне нужно в этом поле. –