Es 3.0.0-snapshot, has_parent


(Dimous) #1

Здравствуйте!
Возможно, это баг и я должен был создать тикет. На случай, если изменилось поведение has_parent:

Я собираю ES каждый день и проверяю одни и те же запросы на одних и тех же данных. Сборка за 26 сентября перестала возвращать результаты.

Иерархия данных такая: классификатор > каталог > товар.

Маппинг:

    "good": {
        "_parent": {
            "type": "catalogue",
            "fielddata": {
                "loading": "eager_global_ordinals" 
            }            
        },   

...
"catalogue": {
"_parent": {
"type": "classifier",
"fielddata": {
"loading": "eager_global_ordinals"
}
},
...
"classifier": {
"_all": {
"enabled": false
},
"_routing": {
"required": true
},
"_timestamp": {
"enabled": true
},
"dynamic": "strict",
"properties": {
"title@classifier": {
"store": "yes",
"type": "string",
"term_vector": "with_positions_offsets"
},
"description@classifier": {
"store": "yes",
"type": "string",
"term_vector": "with_positions_offsets"
}
}
}

Запрос:

GET /good/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"group@good": "d836724e-09bd-11e1-b3c8-0024e8660f34"
}
},
{
"has_parent": {
"parent_type": "catalogue",
"query": {
"has_parent": {
"parent_type": "classifier",
"query": {
"ids": {
"values": [
"2fbee9ce-a8a4-11de-a2f3-000c298dc26a"
]
}
}
}
}
}
}
]
}
}
}

Если убрать has_parent, результат возвращается.
Переиндексировал, результат тот же.


(Igor Motov) #2

Пробовал воспроизвести. Не получается. Вот скрипт, который я пробовал:

curl -XDELETE "localhost:9200/test-idx?pretty"
echo
curl -XPUT "localhost:9200/test-idx?pretty" -d '{
    "mappings": {
        "good": {
            "_parent": {
                "type": "catalogue"
            },
            "properties": {
                "group@good" :{
                    "type": "string",
                    "index": "not_analyzed"
                }
            }
        },
        "catalogue": {
            "_parent": {
                "type": "classifier"
            }
        },
        "classifier": {
            "_all": {
                "enabled": false
            },
            "_routing": {
                "required": true
            },
            "_timestamp": {
                "enabled": true
            },
            "dynamic": "strict",
            "properties": {
                "title@classifier": {
                    "store": "yes",
                    "type": "string",
                    "term_vector": "with_positions_offsets"
                },
                "description@classifier": {
                    "store": "yes",
                    "type": "string",
                    "term_vector": "with_positions_offsets"
                }
            }
        }
    }
}'
curl -XPUT "localhost:9200/test-idx/good/1?parent=2&routing=abc&pretty" -d '{
    "group@good": "d836724e-09bd-11e1-b3c8-0024e8660f34"
}'

curl -XPUT "localhost:9200/test-idx/catalogue/2?parent=2fbee9ce-a8a4-11de-a2f3-000c298dc26a&routing=abc&pretty" -d '{
}'

curl -XPUT "localhost:9200/test-idx/classifier/2fbee9ce-a8a4-11de-a2f3-000c298dc26a?routing=abc&pretty" -d '{
}'

curl -XPOST "localhost:9200/test-idx/_refresh?pretty"

curl -XGET "localhost:9200/test-idx/_search?pretty" -d '{
    "query": {
        "bool": {
            "must": [
                {
                    "term": {
                        "group@good": "d836724e-09bd-11e1-b3c8-0024e8660f34"
                    }
                },
                {
                    "has_parent": {
                        "parent_type": "catalogue",
                        "query": {
                            "has_parent": {
                                "parent_type": "classifier",
                                "query": {
                                    "ids": {
                                        "values": [
                                            "2fbee9ce-a8a4-11de-a2f3-000c298dc26a"
                                        ]
                                    }
                                }
                            }
                        }
                    }
                }
            ]
        }
    }
}'

(Dimous) #3

Выполнил ваши скрипты и получил результат. Потом выполнил этот запрос на реальных данных и тоже получил результат :smile: Начал искать отличия. Я указывал тип документов результата в url. Такой запрос ничего не вернёт:

GET /test-idx/good/_search?pretty
{
    "query": {
        "bool": {
            "must": [
                {
                    "term": {
                        "group@good": "d836724e-09bd-11e1-b3c8-0024e8660f34"
                    }
                },
                {
                    "has_parent": {
                        "parent_type": "catalogue",
                        "query": {
                            "has_parent": {
                                "parent_type": "classifier",
                                "query": {
                                    "ids": {
                                        "values": [
                                            "2fbee9ce-a8a4-11de-a2f3-000c298dc26a"
                                        ]
                                    }
                                }
                            }
                        }
                    }
                }
            ]
        }
    }
} 

В боевой 2.0.0-beta2 всё продолжает работать и на пятничной сборке 3.0.0 тоже. То есть поведение всё-таки изменилось? Теперь не нужно указывать тип результата? Или это баг?


(Dimous) #4

Всё понятно!
Правила стали жёстче. Теперь нужно указывать все типы, перечисленные в запросе - /test-idx/good,catalogue,classifier/_search


(Igor Motov) #5

Нет, похоже, что это все-таки баг.


(Igor Motov) #6

Починили - https://github.com/elastic/elasticsearch/pull/13863


(Dimous) #7

Молодцы! :smile:


(system) #8