2013-11-08 3 views
1

Предположим, что у меня есть родительские документы с именем «комната» и некоторые дочерние документы с именем «человек» с полем «возраст». Теперь я хочу забить несколько комнат, используя поле возраста, используя запрос custom_score в ES.ElasticSearch подсчитывает родительские документы дочерним полем со значениями по умолчанию

Я уже делаю запрос почти как ожидалось, единственная проблема: пустые комнаты (без детских документов) не забиты. Как я могу дать им оценку по умолчанию или что-то в этом роде. В этом примере я хочу забить пять комнат с room_id 1 ~ 5. Если номер 4 не имеет дочерних документов, он не будет забит. Запрос достигнет 4 записей с ожидаемыми результатами. Я хочу, чтобы пустая комната была по умолчанию. Возможно, для этого случая подходит запрос оценки функции, но я использую NEST в качестве клиента .NET, который в настоящее время не поддерживает запрос оценки функции.

BTW: CSS SO здесь не работает, я не знаю почему. Если этот пост не хорошо отформатирован, пожалуйста, помогите отредактировать, спасибо.

{ 
    "query": { 
    "custom_score": { 
     "script": "_score", 
     "query": { 
     "filtered": { 
      "query": { 
      "has_child": { 
       "type": "person", 
       "score_type": "sum", 
       "query": { 
       "custom_score": { 
        "script": "doc['person.age'].value - 50d", 
        "query": { 
        "match_all": {} 
        } 
       } 
       } 
      } 
      }, 
      "filter": { 
      "bool": { 
       "should": [ 
       { 
        "terms": { 
        "room_id": [ "1", "2", "3", "4", "5" ] 
        } 
       } 
       ] 
      } 
      } 
     } 
     } 
    } 
    } 
} 

ответ

4

has_child Ваш фильтр делает включать только родительские записи, которые имеют ребенка, но вы хотите, чтобы все родительские записи. Вы можете использовать логическое значение следует запрашивать с двумя РЕКОМЕНДУЕМЫМ пунктами:

  • записей, у которых есть ребенок (must с has_child и custom_score расчетом)
  • записи, которые не имеют детей (must_not с has_child и счетом по умолчанию)
 
{ 
    "query": { 
    "custom_score": { 
     "script": "_score", 
     "query": { 
     "filtered": { 
      "query": { 
      "bool" : { 
       "should" : [ 
       { 
        "bool" : { 
        "must" : { 
         "has_child": { 
         "type": "person", 
         "score_type": "sum", 
         "query": { 
          "custom_score": { 
          "script": "doc['person.age'].value - 50d", 
          "query": { 
           "match_all": {} 
          } 
          } 
         } 
         } 
        } 
        } 
       }, 
       { 
        "bool" : { 
        "must_not" : { 
         "has_child": { 
         "type": "person", 
         "query": { 
          "match_all": {} 
         } 
         } 
        } 
        } 
       } 
       ] 
      } 
      }, 
      "filter": { 
      "bool": { 
       "should": [ 
       { 
        "terms": { 
        "room_id": ["1","2","3","4","5"] 
        } 
       } 
       ] 
      } 
      } 
     } 
     } 
    } 
    } 
} 
Смежные вопросы