Запрос ElasticSearch has_child ничего не находит

У меня проблема, объекты были проиндексированы, но при поиске с помощью has_child ничего не возвращается.

Сопоставление:

Родитель:

$ curl -XGET 'http://localhost:9200/items/article/_mapping?pretty'
"items" : {
    "mappings" : {
        "article" : {
            "_meta" : {
                "model" : "..."
            },
            "_source" : {
                "enabled" : false,
                "includes" : [ ],
                "excludes" : [ ]
            },
            "properties" : {
                "content" : {
                    "type" : "string",
                    "store" : true,
                    "analyzer" : "app_standard",
                    "fields" : {
                        "transliterated" : {
                            "type" : "string",
                            "analyzer" : "transliteration"
                        },
                        "stemmed" : {
                            "type" : "string",
                            "analyzer" : "app_text_analyzer"
                        }
                    }
                }
                ,...
            }
        }
    }
}

Ребенок:

$ curl -XGET 'http://localhost:9200/items/comment/_mapping?pretty'
"items" : {
    "mappings" : {
        "comment" : {
            "_meta" : {
                "model" : "..."
            },
            "_parent" : {
                "type" : "article"
            },
            "_routing" : {
                "required" : true,
                "path" : "article_id"
            },
            "_source" : {
                "enabled" : false,
                "includes" : [ ],
                "excludes" : [ ]
            },
            "properties" : {
                "article_id" : {
                    "type" : "long",
                    "store" : true
                }
                ,...
            }
        }
    }
}

Существуют как родительские, так и дочерние документы:

Родитель:

$ curl -XGET 'http://localhost:9200/items/article/110700879894'

результат:

{
  "_index": "items",
  "_type": "article",
  "_id": "110700879894",
  "_version": 1,
  "found": true
}

Ребенок без маршрутизации терпит неудачу:

$ curl -XGET 'http://localhost:9200/items/comment/110700879894.110700879894'

результат:

{
  "error": "RoutingMissingException[routing is required for [items]/[comment]/[110700879894.110700879894]]",
  "status": 400
}

Ребенок с маршрутизацией:

$ curl -XGET 'http://localhost:9200/items/comment/110700879894.110700879894?parent=110700879894'

результат:

{
  "_index": "items",
  "_type": "comment",
  "_id": "110700879894.110700879894",
  "_version": 1,
  "found": true
}

Но has_child ничего не находит:

$ curl -XGET 'http://localhost:9200/items/article/_search' -d '{
  "query": {
    "has_child": {
      "type": "comment",
      "query": {
        "term": {
          "article_id": "110700879894"
        }
      }
    }
  }
}'

результат:

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

has_parent тоже:

$ curl -XGET 'http://localhost:9200/items/comment/_search' -d '{
  "query": {
    "has_parent": {
      "type": "article",
      "query": {
        "match_all": {}
      }
    }
  }
}'

результат:

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

Я предполагаю, что в индексировании было что-то подозрительное, отношение родитель-потомок не было установлено. Но с другой стороны, ребенок был найден с правильной маршрутизацией.

Или я просто делаю запрос неправильно.

Как я могу проверить, что является дочерними документами родителя?

Изменить

Запрос на индексацию:

PUT http://localhost:9200/_bulk
{"index":{"_index":"items","_type":"comment","_id":"110700879894.110700879894"}}
{"article_id":"110700879894",...}

Разве здесь не должно быть родителя или что-то в этом роде?


person JohnSmith    schedule 02.08.2014    source источник
comment
Вам действительно нужно указать родителя при индексации   -  person Frederick Cheung    schedule 03.08.2014


Ответы (2)


Как написано в документации:

«По умолчанию _id не индексируется и не сохраняется (таким образом, не создается)».

person Ashalynd    schedule 03.08.2014
comment
Хорошо, правильно, но все равно не повезло (я отредактировал запросы has_child и has_parent в исходном сообщении). Я предполагаю, что если has_parent match_all ничего не возвращает, то это проблема с индексацией, и я должен это проверить? - person JohnSmith; 03.08.2014

Проблема была с FOSElasticaBundle. https://github.com/FriendsOfSymfony/FOSElasticaBundle/blob/master/Resources/doc/types.md#parent-fields указывает, что _parent должен быть отделен от «сопоставлений», но Transformer не получил определения _parent. См. также https://github.com/FriendsOfSymfony/FOSElasticaBundle/pull/665.

Я предполагаю, что самым быстрым способом будет копирование _parent в разделе сопоставлений (не могу быть уверенным на 100%, потому что я написал свой собственный Transformer). Также ModelToElasticaAutoTransformer делает некоторые странные вещи при установке дочерних документов как родительских - получает дочернее поле parent_id, ожидая, что это родительский объект, затем получает его идентификатор, используя дочерний настройка сильного> идентификатора. Я думаю, что это глючит :)

if ($key == '_parent') {
        $property = (null !== $mapping['property'])?$mapping['property']:$mapping['type'];
        $value = $this->propertyAccessor->getValue($object, $property);
        $document->setParent($this->propertyAccessor->getValue($value, $mapping['identifier']));
        continue;
}
person JohnSmith    schedule 03.08.2014
comment
Я попытался скопировать _parent в разделе сопоставлений, и это не сработало. Я думаю, что это может быть устаревший код, который больше не актуален. Я знаю, что это подход в FOQElastica, но не в FOSElastica. Как и Джону, мне пришлось использовать собственный трансформер. - person Ben Stinton; 16.04.2015