2015-05-08 5 views
2

В поиске по эластичности У меня есть индекс, содержащий пользователей и URL-адреса, которые они посетили. Я хочу, чтобы иметь возможность искать несколько пользователей и найти общие URL-адреса, которые они посетили.Эластичный поиск - поиск данных, общих для нескольких запросов

я могу захватить URL-адресов для одного пользователя:

{ 
    "size": 0, 
    "query": { 
     "filtered": { 
      "query": { 
       "query_string": { 
        "query": "user:bob" 
       } 
      }, 
      "filter": { 
       "bool": { 
        "must": [{ 
          "range": { 
           "@timestamp": { 
            "gte": 1430456930549, 
            "lte": 1430666630549 
           } 
          } 
         }], 
        "must_not": [] 
       } 
      } 
     } 
    }, 
    "aggs": { 
     "1": { 
      "terms": { 
       "field": "url", 
       "size": 0, 
       "order": { 
        "_count": "desc" 
       } 
      } 
     } 
    } 
} 

Но как я объединить результаты от каждого пользователя (делает какое-то пересечение). Я могу сделать это программно, но может ли Elastic Search сделать это с какой-то агрегацией?

ответ

1

Вы можете использовать вложенные агрегаты, термины по URL-адреса в терминах пользователей:

{ 
    "query": { 
     "match_all": {} 
    }, 
    "aggs": { 
     "users": { 
     "terms": { 
      "field": "user" 
     }, 
     "aggs": { 
      "urls": { 
       "terms": { 
        "field": "url" 
       } 
      } 
     } 
     } 
    } 
} 

Это даст вам ведра пользователей, каждый из которых содержат ведра URLs.

UPD Сначала я неправильно понял ваш вопрос. Я не знаю такого типа агрегации, которую вы ищете. Однако вы можете воспользоваться significant terms aggregation:

{ 
    "query": { 
     "filtered": { 
     "filter": { 
      "terms": { 
       "user": ["alice", "jack"] 
      } 
     } 
     } 
    }, 
    "aggs": { 
     "urls": { 
     "significant_terms": { 
      "field": "url", 
      "size": 5 
     } 
     } 
    } 
} 

Это даст вам ведра с наиболее популярными адресами в пределах данного набора пользователей. Обратите внимание, что в любом случае это не строгое пересечение, а список, в котором верхние элементы - это URL-адреса, которые чаще встречаются в так называемой группе переднего плана (область запроса), чем в фоновой группе (все документы индекса).

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

Но если каждый из 2 запрошенных пользователей посещает свой собственный любимый сайт намного больше, чем другие сайты, и он не посещает любимый сайт другого пользователя, оба URL-адреса все равно будут отображаться и будут оцениваться выше, чем общие.

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

Вы можете почитать больше об этом here и here.

+0

Благодарим за информацию - но это дает такие же результаты, как если бы я запрашивал каждого пользователя в отдельности, и он не выполняет каких-либо слияний/пересечений данных. – thelok

+0

@thelok Я сначала неправильно понял ваш вопрос, см. Расширенный ответ о значительном объединении терминов. Хотя он не дает точно то, что вы ищете, но вы можете использовать его. – tiurin

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