2016-03-14 3 views
0

Я хотел бы использовать эластики для фильтрации следующих несколько матчей в категории:эластик - несколько запросов BOOL - подзапросы

Что-то вроде:

(categories.name = «категории-1» и категории. уровень = 0) И (categories.name = "категория-2" И categories.level = 1)

"title": "Test Product 1", 
"categories": [ 
    { 
    "id": 1, 
    "name": "category-1", 
    "title": "Category 1", 
    "level": 0 
    }, 
    { 
    "id": 2, 
    "name": "category-2", 
    "title": "Category 2", 
    "level": 1 
    } 
] 

Я попытался:

$matchQuery = new Query\Match(); 
    $matchQuery->setField('categories.name', 'category-1'); 
    //I don't know how to add AND categories.level = 0 

    $boolQuery1 = new Bool(); 
    $boolQuery1->addMust($matchQuery); 

    $results = $record->search($boolQuery1)->getResults(); 

ответ

1

Просто перевел ваши логические предложения в формат JSON, который можно передать непосредственно в запрос elasticsearch. Я думаю, что это должно сработать.

{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "nested": { 
      "path": "categories", 
      "query": { 
       "bool": { 
       "must": [ 
        { 
        "term": { 
         "categories.name": { 
         "value": "category-1" 
         } 
        } 
        }, 
        { 
        "term": { 
         "categories.level": { 
         "value": "0" 
         } 
        } 
        } 
       ] 
       } 
      } 
      } 
     }, 
     { 
      "nested": { 
      "path": "categories", 
      "query": { 
       "bool": { 
       "must": [ 
        { 
        "term": { 
         "categories.name": { 
         "value": "category-2" 
         } 
        } 
        }, 
        { 
        "term": { 
         "categories.level": { 
         "value": "1" 
         } 
        } 
        } 
       ] 
       } 
      } 
      } 
     } 
     ] 
    } 
    } 
}