2015-03-16 4 views
0

У меня есть поле под названием «категория».elasticsearch возвращает уникальные значения

я могу вернуть список возможных категорий, просто делая:

$searchParams['body']['aggs']['category']['terms']['field'] = 'category'; 

Но я хочу, чтобы искать в этой области и возвращать только категорию, соответствующую мой запрос.

Пример списка:

  1. Пицца
  2. Яблочный пирог
  3. оранжевый пирог
  4. кекс
  5. Burger

Я хочу, чтобы искать "пирога" и имеют следующие результат:

  1. Яблочный пирог
  2. Апельсиновый пирог

Есть более чем 200 категорий. Я хочу сделать это способом elasticsearch, не используя MySQL в качестве поиска.

Спасибо за помощь :)

+0

Я не вижу ни одной структуры индекса ElasticSearch, ни тех запросов, которые вы пробовали. Я что-то пропустил? –

ответ

0

Скопления работают в "scope" of the query. Поэтому, если вы выполните поисковый запрос для "pie", агрегация будет видеть только (и агрегировать) документы «пирог».

$query = [ 
    'index' => 'my_index', 
    'type' => 'my_type', 
    'search_type' => 'count', // <-- Note search_type = count, to ignore search hits 
    'body' => [ 
     'query' => [ 
      'match' => [ 
       'category' => 'pie' 
      ] 
     ], 
     'aggs' => [ 
      'category' => [ 
       'terms' => [ 
        'field' => 'category' 
       ] 
      ] 
     ] 
    ] 
]; 

$results = $client->search($query); 
+0

Это правильно. Но я получу все продукты с пирогом категории. Мне просто нужно найти разные имена категорий, основанные на моем запросе, в этом случае pie. Я получаю 50 яблочных пирогов и 200 апельсиновых пирогов. Мне нужен только яблочный пирог и оранжевый пирог в списке, а не предметы с этой категорией. – TrueSkillZ

+0

Ух, я вижу. в этом случае вы можете использовать тип поиска 'count', который возвращает результаты агрегации (и результаты поиска не отображаются). Я отредактирую свой ответ, чтобы продемонстрировать – Zach