Elasticsearch — запрос Has_Parent или Has_Child, возвращающий пустые результаты

Я использую ElasticsearchRC 2.0.0.

У меня есть некоторые отношения между родителями и детьми в моей базе данных Elasticsearch. Я хочу получить все дочерние элементы, связанные с родительским объектом. Я всегда получаю пустой список результатов. Я следовал инструкциям документации elasticsearch и сравнивал свой код с несколькими книгами. Я не понимаю, почему мой запрос должен возвращать пустой результат.

В этом случае я построил упрощенный пример. Я помещаю два объекта в elasticsearch и устанавливаю объект a в качестве родителя объекта b. Затем я пытаюсь получить все объекты, у которых есть родитель типа a.

Это мой ввод:

PUT test

PUT test/myobject/_mapping
    {
        "myobject":{
        "_parent" : {"type":"pobject"},
        "properties" : {
         "name" : {"type":"string"}   
        }

        }
    }

    PUT test/pobject/_mapping
    {
        "pobject" : {
            "properties": {
                "name": {"type":"string"}
            }

        }

    }

    PUT test/pobject/1
    {
        "name":"theParent"
    }

    PUT test/myobject/1?_parent=1&routing=_id
    {
        "name":"theChild"
    }

    POST test/myobject/_search?routing=_id
    {
         "query":{
            "has_parent":{
                 "type":"pobject",
            "query":{
                "match_all":{}
            }
            }
        }


    }

Это вернет

{
   "took": 2,
   "timed_out": false,
   "_shards": {
      "total": 1,
      "successful": 1,
      "failed": 0
   },
   "hits": {
      "total": 0,
      "max_score": null,
      "hits": []
   }
}

person Goot    schedule 02.11.2015    source источник


Ответы (1)


Ошибка здесь: PUT test/myobject/1?_parent=1&routing=_id

Параметр parent, а не _parent.

POST test/myobject/1?parent=1
{
  "name": "theChild"
}

Кроме того, вам не нужно использовать routing=_id. См. документацию.

Полный список команд для тестирования:

DELETE test
PUT test

PUT test/myobject/_mapping
{
  "myobject": {
    "_parent": {
      "type": "pobject"
    },
    "properties": {
      "name": {
        "type": "string"
      }
    }
  }
}

PUT test/pobject/_mapping
{
  "pobject": {
    "properties": {
      "name": {
        "type": "string"
      }
    }
  }
}

POST test/pobject/1
{
  "name": "theParent"
}

POST test/myobject/1?parent=1
{
  "name": "theChild"
}

POST test/myobject/_search
{
  "query": {
    "has_parent": {
      "parent_type": "pobject",
      "query": {
        "match_all": {}
      }
    }
  }
}
person Andrei Stefan    schedule 02.11.2015
comment
Привет, спасибо, но я все еще получаю пустой список результатов. в любом случае, когда я вызываю test/myobject/1, я вижу, что для этого элемента зарегистрирован родитель. - person Goot; 02.11.2015
comment
Причина: я использовал неправильное имя для параметров типа родителей (type вместо parent_type), также я сделал ошибку при использовании параметра сопоставления. спасибо - person Goot; 03.11.2015
comment
Я сделал ту же ошибку, проиндексировав его, используя routing вместо parent. - person Jaider; 22.09.2016