2016-08-11 2 views
1

Я тип в эластичном с документами с этой структуройСортировки по вложенной области

{ 
    "name": "Foo Bar", 
    "myTags": [ 
    { 
     "id": 3, 
     "name": "My tag 1" 
    }, 
    { 
     "id": 5, 
     "name": "My Tag 5" 
    }, 
    { 
     "id": 7, 
     "name": "My Tag 7" 
    } 
    ] 
} 

Теперь, учитывая 3 тегов я хотел бы получить все документы, отсортированных по количеству совпадающих тегов. Итак, сначала документы, которые соответствуют всем тэгам, чем те, которые соответствуют 2, а затем никому.

Как я могу это сделать?

+0

используется тем самым увеличив счет этого и использовать 'bool' с тремя (3 тегами)' should' заявление, которые увеличат выигрыш, если один тег «спичка» (что бы это ни значило в вашем случае использования). Идея состоит в том, что если один тег соответствует, это увеличит счет. –

ответ

0

Вы можете сделать это с function_score:

{ 
    "query": { 
    "function_score": { 
     "query": { 
     "match_all": {} 
     }, 
     "functions": [ 
     { 
      "filter": { 
      "nested": { 
       "path": "myTags", 
       "query": { 
       "term": { 
        "myTags.name": "My Tag 1" 
       } 
       } 
      } 
      }, 
      "weight": 1 
     }, 
     { 
      "filter": { 
      "nested": { 
       "path": "myTags", 
       "query": { 
       "term": { 
        "myTags.name": "My Tag 5" 
       } 
       } 
      } 
      }, 
      "weight": 1 
     }, 
     { 
      "filter": { 
      "nested": { 
       "path": "myTags", 
       "query": { 
       "term": { 
        "myTags.name": "My Tag 7" 
       } 
       } 
      } 
      }, 
      "weight": 1 
     } 
     ], 
     "boost_mode": "sum", 
     "score_mode": "sum" 
    } 
    } 
} 
+0

Я забыл упомянуть, что я на Эластике 1.7.5. Этот вопрос одобрен? – Hpatoio

+0

Он должен работать с 1.7. Идея состоит в том, что если документ соответствует одному из тегов, то оценка получает +1. Если это соответствует другому тегу, то еще +1 и так далее. В основном, итоговым счетом будет количество совпадающих тегов +1 (от стандартного запроса по умолчанию 'match_all'). –

+0

Мне пришлось изменить «вес: 1» на «вес: 2», иначе я получал странный/неправильный результат при фильтрации только одним тегом. – Hpatoio

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