2015-10-27 2 views
0

У меня есть следующий фильтр:Фильтра по товарам и показывая доступные варианты использование Elasticsearch

enter image description here

Как вы можете видеть здесь, у меня есть атрибуты (выше каждая горизонтальная линии) и все существующих значения для этих атрибутов (ниже каждой горизонтальной линии).

Серверные данные из формы: ["X"=>['1','2', ...], "Y"=>['11','22', ...]] где X, Y = идентификаторы атрибутов. 1,2,11,22 = ids значений.

Мой вариант запроса:

http://sense.qbox.io/gist/821b25abc1aa4720942a2d9cc7d759bdaee447a9 (Mapping там тоже). Но это работает странно. Агрегирование работает не с отфильтрованными данными.

Мне нужно фильтровать товары и показывать количество доступных параметров для каждого значения. Как это сделать? Теперь, когда я проверяю некоторые значения, я получаю И, И, И (данные суммируются). Количество окончательного набора данных только увеличивается.

Edit:

Мне нужно, чтобы иметь возможность выбрать несколько значений из каждого атрибута, и мне нужно, чтобы получить данные для каждого значения. Когда я выбираю 1 значение из одного атрибута и одно значение из другого, мне нужно получить документы, которые соответствуют значению 1 И 2. Когда я выбираю несколько значений из одного атрибута и нескольких значений из другого, мне нужно получить хотя бы одно значение пары (attribute1) и value (attribute2). Также мне нужно показать количество доступных опций для всех значений.

Я написал (и это работает):

$query = [ 
     "query" => [ 
      "filtered"=> [ 

       "filter" => [ 
        "nested"=> [ 
         "path"=> "individual_attributes", 
         "filter"=> [ 

          "bool"=> [ 
           "must"=> [ 


            $nested 


           ] 
          ] 
         ] 
        ] 
       ] 
      ] 
     ], 

     "aggs"=> [ 
      "individual_attributes"=> [ 


       "nested"=> ["path"=> "individual_attributes"], 
       "aggs"=> [ 

        "attributes_set"=> [ 
         "nested"=> [ 
          "path"=> "individual_attributes.attributes_set" 
         ], 
         "aggs"=> [ 
          "attributes"=> [ 
           "terms"=> [ 
            "field"=> "individual_attributes.attributes_set.attribute_value" 
           ] 
          ] 
         ] 
        ] 

       ] 


      ] 
     ] 

    ]; 

$ вложенного идентификатор ($params = ["X"=>['1','2', ...], "Y"=>['11','22', ...]]):

foreach($params as $k => $v){ 

    foreach ($v as $sub) 
    { 

    $nested[] = [ 
        "nested" => [ 
         "path" => "individual_attributes.attributes_set", 
         "filter" => [ 
          "bool" => [ 
           "must" => [ 
            [ 
             "term" => [ 
              "individual_attributes.attributes_set.attribute_id" => [ 
               "value" => $k 
              ] 
             ] 
            ], 
            [ 
             "term" => [ 
              "individual_attributes.attributes_set.attribute_value" => [ 
               "value" => $sub 
              ] 
             ] 
            ] 
           ] 
          ] 
         ] 
        ] 
       ]; 
    } 
} 

отлично работает. Но я не могу выбрать несколько значений из одного атрибута.

enter image description here

+0

Эта часть не ясна: «Теперь, когда я проверяю некоторые значения, я получаю И, И, И» Можете ли вы прояснить и, возможно, показать некоторые примеры документов и то, что вы ожидаете в своих результатах, так что людям легче воссоздать проблему ? – Val

ответ

0

Есть три вида фильтров, которые вы можете использовать. Согласно документации, здесь объяснение все три: 1.) отфильтрованный запрос:

Отфильтрованный запрос используется для объединения другого запроса с любым фильтром. В отфильтрованном запросе фильтр уменьшает количество документов, которые могут быть сопоставлены (и подсчитаны) по запросу .

2.) Постоянная оценка запрос:

Запрос, который оборачивает фильтр или другой запрос, и просто возвращает постоянного счета равного импульса запроса для каждого документа в фильтре.

«constant_score» запрос А говорит «все документы равны», поэтому не скоринг не должно произойти - только фильтр будет применяться

3.) Post Filter:

post_filter применяется для поиска хитов в самом конце запроса поиска, после того, как агрегирование уже вычислены.

Это означает, что фильтр будет применен к результату поиска после расчета агрегатов. Достигнутые вами хиты будут фильтроваться, а не результаты агрегации.

Следовательно, результаты агрегации после фильтров не считаются фильтром, где в качестве постоянной оценки и отфильтрованного запроса результаты фильтрации уже фильтруются. Если вас действительно не интересует оценка результатов и вам нужны только значения агрегации, попробуйте обернуть свой запрос/фильтры в постоянном баллате.

Надеюсь, это поможет.

Смежные вопросы