2014-09-09 3 views
0

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

[test] => Array 
    (
     [mappings] => Array 
      (
       [testype] => Array 
        (
         [properties] => Array 
          (
           [brand_id] => Array 
            (
             [type] => integer 
            ) 

           [color] => Array 
            (
             [type] => string 
             [index] => not_analyzed 
            ) 

           [description] => Array 
            (
             [type] => string 
            ) 

           [discount] => Array 
            (
             [type] => float 
            ) 

           [newprice] => Array 
            (
             [type] => float 
            ) 

           [oldprice] => Array 
            (
             [type] => float 
            ) 

           [sex] => Array 
            (
             [type] => string 
             [index] => not_analyzed 
            ) 

           [store_id] => Array 
            (
             [type] => integer 
            ) 

           [title] => Array 
            (
             [type] => string 
            ) 

          ) 

        ) 

      ) 

    ) 

И пытается фильтровать данные с этим запросом:

Array 
(
[index] => test 
[type] => testype 
[size] => 100 
[body] => Array 
    (
     [query] => Array 
      (
       [filtered] => Array 
        (
         [filter] => Array 
          (
           [bool] => Array 
            (
             [must] => Array 
              (
               [term] => Array 
                (
                 [brand_id] => 53 
                 [color] => red 
                ) 

              ) 

            ) 

          ) 

        ) 

      ) 

    ) 

) 

Ожидая, чтобы получить результат, как SELECT ... WHERE brand_id = 53 И цвет = красный, но есть результаты, такие как brand_id = 53 OR color = red. Мне что-то не хватает?

Фактически, я хочу иметь такой фильтр, как SELECT ... WHERE aaaa = 'a' AND bbbb = 'b' AND cccc IN (1,2,6,9) И ddd IN (xxx, yyy)

ответ

1

Вы должны поместить термины в разные массивы.

Отказ от ответственности: Я предполагаю, что этот синтаксис является PHP, я не знаком с ним, прошу простить любую синтаксическую ошибку.

Попробуйте это:

[must] => Array 
    (
     [term] => Array 
      (
       [brand_id] => 53 
      ) 
     [term] => Array 
      (
       [color] => red 
      ) 
    ) 

Ваш последний запрос должен выглядеть следующим образом:

[must] => Array 
    (
     [term] => Array 
      (
       [aaaa] => 'a' 
      ) 
     [term] => Array 
      (
       [bbbb] => 'b' 
      ) 
     [terms] => Array 
      (
       [cccc] => Array(1, 2, 6, 9) 
       [minimum_should_match] => 1 
      ) 
     [terms] => Array 
      (
       [dddd] => Array('xxx', 'yyy') 
       [minimum_should_match] => 1 
      ) 
    ) 
+0

Большое спасибо, вот у меня работает. Могу ли я попросить вас объяснить, что если я не предоставил [minimum_should_match] => 1, потому что это без него, как мне кажется. – oleg

+0

Вы правы, значение по умолчанию 'minimum_should_match' по умолчанию равно 1. Но я предпочитаю явно указывать его, чтобы избежать путаницы. –

+0

Спасибо за помощь. – oleg