저는 elasticsearch를 처음 사용하고 있으며 필요한 쿼리를 작성하는 데 문제가 있습니다. 나는 질의, 필터링, booling 질의 및 중첩 된 객체를 읽었지만 여전히 약간 혼란 스럽다. 나는 elasticsearch를 위해 PHP 작곡자 패키지를 사용하고 있지만, 제 설정에 더 많은 문제가 있다고 생각합니다.Elasticsearch : 중첩 된 객체의 다중 배열을 필터링합니다.
개체의 속성과 중첩 된 개체의 속성을 기반으로 개체를 필터링하려고합니다. 다음과 같이 내가 가진 것
예를 들어 객체는 다음과 같습니다
{
'id' : '1',
'title' : 'real catchy title',
'description' : 'description goes here',
'content' : [
'id' : '1',
'title' : 'foo',
'subtitle' : 'bar',
'text' : 'legit full text',
'sidebar' : 'whatever yo!',
],
'pages' : '12',
'departments' : [
{
'id' : '1',
'name' : 'foo',
'description' : 'lorem ipsum'
},
{
'id' : '2',
'name' : 'bar',
'description' : 'lorem ipsum'
}
]
'themes' : [
{
'id' : '1',
'name' : 'foo',
'description' : 'lorem ipsum',
'month' : '3'
},
{
'id' : '2',
'name' : 'bar',
'description' : 'lorem ipsum',
'month' : '2'
}
]
}
을 나는 페이지가 주어진 번호와 일치하는 경우에 기반이를 필터링하기 위해 노력하고있어, 그것은 주어진 부서와 부서가있는 경우 id 및 주어진 테마 ID가있는 테마가 있습니다. 내가 삽입
[
'index' : ,'reusable_content'
'body' => [
'mappings' => [
'reusable_content' => [
'_all' => ['analyzer' => 'english'],
'properties' => [
'departments' => [
'type' => 'nested',
"include_in_parent" => true
],
'themes' => [
'type' => 'nested',
"include_in_parent" => true
]
]
]
]
]
]
후, 나는 몇 가지 항목을 추가 한 후이를 조회 할 수있는 몇 가지 방법을 시도했다 :로이 작업을 수행하기 위해
, 내 매핑을 가지고있다.
나는 부울 중첩 된 필터를 사용하여 시도했다 :
이[
'index' => $this->getIndexName(),
'type' => 'reusable_content',
'body' => [
'query' => [
'filtered' => [
'query' => ['match_all' => []],
'filter' => [
'bool' => [
'should' => [
'nested' => [
'path' => 'themes',
'filter' => [
'bool' => [
'must' => [
'term' => [
'id' => $themeId
]
]
]
]
],
'nested' => [
'path' => 'departments',
'filter' => [
'bool' => [
'must' => [
'term' => [
'id' => $departmentId
]
]
]
]
]
]
]
]
]
]
]
]
이 어떤 결과를 반환하지 않습니다.
내가 부울뿐만 아니라 필터에 대한 쿼리해야 같은 간단한 방법을 사용하여 시도했다 :이 대부분 작동
[
'index' => $this->getIndexName(),
'type' => 'reusable_content',
'body' => [
'query' => [
'filtered' => [
'query' => ['match_all' => []],
'filter' => [
'bool' => [
'must' => ['term' => ['pages' => $pages]],
'must' => ['term' => ['departments.id' => $departmentId]],
'must' => ['term' => ['themes.id' => $themeId]],
]
]
]
]
]
]
을, 그러나 그것은 페이지가 그러나 나는 단지 필터의 'must' => ['term' => ['pages' => $pages]],
이있는 경우, 필터링 무시 id 필드를 무시하면 페이지 필터가 작동합니다.
저는 신축성있는 검색에 익숙하지 않아 뭔가 이상한 가정을하거나 아주 잘못된 것을하고있는 경우 알려 주시면 알려 드리겠습니다. 더 많은 정보가 필요하면 문의하십시오!
흥미 롭습니다. 그러나, 제 경우에는 페이지와 ID는 항상 숫자가 될 것입니다. 나는 이상한 토큰 변환을 기대하지 않을 것이다. 또한, 내가 개별적으로 사용하면 작동하지만, 3 가지를 모두 결합하려고하면 그렇지 않을 때가 있습니다. – samuraiseoul
그들은 숫자가 될 것인데 유형을 정수로 설정 했습니까? – rajat