2016-07-19 5 views
1

저는 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 필드를 무시하면 페이지 필터가 작동합니다.

저는 신축성있는 검색에 익숙하지 않아 뭔가 이상한 가정을하거나 아주 잘못된 것을하고있는 경우 알려 주시면 알려 드리겠습니다. 더 많은 정보가 필요하면 문의하십시오!

답변

1

첫 번째 검색어는 괜찮습니다. 분석기와 검색어로 문제가있는 것 같습니다. 용어 필터는 거꾸로 된 색인에서 정확히 일치하는 항목을 찾습니다. 예를 들어 테마 이름이 '행복'이라고 가정하면 영어 분석기에서 '행복'으로 색인을 생성 할 수 있습니다. 그래서 용어 필터는 위의 경우에 '행복'이 아니라 '행복'이 아닌 정확한 색인 된 토큰을 필요로합니다. 나는 먼저 문자열을 분석하기 때문에 검색어 필터를 일치 검색어로 바꾸고 결과가 반환되면 분석기를 변경하거나 일치 검색어를 계속 사용하는 것이 좋습니다.

+0

흥미 롭습니다. 그러나, 제 경우에는 페이지와 ID는 항상 숫자가 될 것입니다. 나는 이상한 토큰 변환을 기대하지 않을 것이다. 또한, 내가 개별적으로 사용하면 작동하지만, 3 가지를 모두 결합하려고하면 그렇지 않을 때가 있습니다. – samuraiseoul

+0

그들은 숫자가 될 것인데 유형을 정수로 설정 했습니까? – rajat

관련 문제