Сопоставление вложенных объектов эластичного поиска и запрос для поиска

Я пытаюсь использовать Elastic Search, и я застрял, пытаясь запросить вложенный объект.

В основном мой объект имеет следующий формат

{
     "name" : "Some Name",
     "field2": [
          { 
            "prop1": "val1",
            "prop2": "val2"
          },
          {
             "prop1": "val3",
             "prop2":: "val4"
          }
      ]
}

Сопоставление, которое я использовал для вложенного поля, выглядит следующим образом.

PUT /someval/posts/_mapping
{
    "posts": {
       "properties": {
           "field2": {
              "type": "nested"
           }
        }
    }
}

Скажем, теперь я вставляю элементы для /field/posts/1 и /field/posts/2 и т. д. У меня есть k значений для field2.prop1, и я хочу запрос, который отсортирует сообщения на основе наибольшего совпадения field2.prop1 среди K ценности у меня есть. Какой будет соответствующий запрос для этого. Также я попробовал простой фильтр, но даже он не работает правильно.

GET /someval/posts/_search
{
 "query": {
   "filtered": {
     "query": {
        "match_all": {}
     }
   },
   "filter" : {
        "nested" : {
            "path" : "field2",
            "filter" : {
                "bool" : {
                    "must" : [
                        {
                            "term" : {"field2.prop1" : "val1"}
                        }
                    ]
                }
            },
            "_cache" : true
        }
    }
  } 
 }

Приведенный выше запрос должен соответствовать как минимум первому сообщению. Но он не возвращает совпадения. Может ли кто-нибудь помочь прояснить, что здесь не так?


person sriram    schedule 27.07.2014    source источник


Ответы (1)


В вашей структуре json возникла проблема, вы использовали отфильтрованный запрос, но фильтр (объект) находился на другом уровне, чем запрос.

Найдите разницу.

POST /someval/posts/_search
{
   "query": {
      "filtered": {
         "query": {
            "match_all": {}
         },
         "filter": {
            "nested": {
               "path": "field2",
               "filter": {
                  "bool": {
                     "must": [
                        {
                           "term": {
                              "field2.prop1": "val1"
                           }
                        }
                     ]
                  }
               },
               "_cache": true
            }
         }
      }
   }
}
person progrrammer    schedule 27.07.2014
comment
Спасибо! Есть ли какой-нибудь отладчик для запросов? Также как можно выполнить запрос для большинства совпадений в массиве объектов? Подобно тому, что я разместил в вопросе - person sriram; 27.07.2014
comment
Я использую смысл, я не знаю ни одного. В следующей части, возможно, вы зададите отдельный вопрос, чтобы другим пользователям было легко найти его полезным. - person progrrammer; 27.07.2014