2015-09-09 4 views
0

Итак, у меня есть данные о посетителях за последние несколько лет - более 14 миллионов записей. Кроме того, у меня есть данные формы за последние несколько лет. Между ними существует общий идентификатор.ElasticSearch + Kibana для отображения бизнес-данных

Сейчас я пытаюсь изучить ElasticSearch + Kibana, используя данные посетителя. Данные довольно просты, но не очень хорошо отформатированы - данные PHP $ _REQUEST и $ _SERVER. Вот пример с ботом визита Google:

{u'Entrance Time': 1407551587.7385, 
u'domain': u'############', 
u'pages': {u'6818555600ccd9880bf7acef228c5d47': {u'REQUEST': [], 
    u'SERVER': {u'DOCUMENT_ROOT': u'/var/www/####/', 
    u'Entrance Time': 1407551587.7385, 
    u'GATEWAY_INTERFACE': u'CGI/1.1', 
    u'HTTP_ACCEPT': u'*/*', 
    u'HTTP_ACCEPT_ENCODING': u'gzip,deflate', 
    u'HTTP_CONNECTION': u'Keep-alive', 
    u'HTTP_FROM': u'googlebot(at)googlebot.com', 
    u'HTTP_HOST': u'############', 
    u'HTTP_IF_MODIFIED_SINCE': u'Fri, 13 Jun 2014 20:26:33 GMT', 
    u'HTTP_USER_AGENT': u'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)', 
    u'PATH': u'/usr/local/bin:/usr/bin:/bin', 
    u'PHP_SELF': u'/index.php', 
    u'QUERY_STRING': u'', 
    u'REDIRECT_SCRIPT_URI': u'http://############/', 
    u'REDIRECT_SCRIPT_URL': u'############', 
    u'REDIRECT_STATUS': u'200', 
    u'REDIRECT_URL': u'############', 
    u'REMOTE_ADDR': u'############', 
    u'REMOTE_PORT': u'46271', 
    u'REQUEST_METHOD': u'GET', 
    u'REQUEST_TIME': u'1407551587', 
    u'REQUEST_URI': u'############', 
    u'SCRIPT_FILENAME': u'/var/www/PIAN/index.php', 
    u'SCRIPT_NAME': u'/index.php', 
    u'SCRIPT_URI': u'http://############/', 
    u'SCRIPT_URL': u'/############/', 
    u'SERVER_ADDR': u'############', 
    u'SERVER_ADMIN': u'[email protected]############', 
    u'SERVER_NAME': u'############', 
    u'SERVER_PORT': u'80', 
    u'SERVER_PROTOCOL': u'HTTP/1.1', 
    u'SERVER_SIGNATURE': u'<address>Apache/2.2.22 (Ubuntu) Server at ############ Port 80</address>\n', 
    u'SERVER_SOFTWARE': u'Apache/2.2.22 (Ubuntu)', 
    u'uniqID': u'bbc398716f4703cfabd761cc8d4101a1'}, 
    u'SESSION': {u'Entrance Time': 1407551587.7385, 
    u'uniqID': u'bbc398716f4703cfabd761cc8d4101a1'}}}, 
u'uniqID': u'bbc398716f4703cfabd761cc8d4101a1'} 

Я использую пакет elasticsearch.py ​​Python как мой интерфейс. Я создаю мой индекс, как это:

es.indices.create(
    index=Visit_to_ElasticSearch.INDEX, 
    body={ 
     'settings': { 
      'number_of_shards': 5, 
      'number_of_replicas': 1, 
     } 
    }, 
    # ignore already existing index 
    ignore=400 
) 

И это мое отображение:

# Create mappings of a visit 
time_date_mapping = { 'type': 'date_time' } 
str_not_analyzed = { 'type': 'string'} # This used to include 'index': 'not_analyzed' 

visit_mapping = { 
    'properties': { 
     'uniqID': str_not_analyzed, 
     'pages': str_not_analyzed, 
     'domain': str_not_analyzed, 
     'Srvr IP': str_not_analyzed, 
     'Visitor IP': str_not_analyzed, 
     'Agent': { 'type': 'string', 'index': 'not_analyzed' }, 
     'Referrer': { 'type': 'string' }, 
     'Entrance Time': time_date_mapping, 
     'Request Time': time_date_mapping, 
     'Raw': { 'type': 'string', 'index': 'not_analyzed' }, 
     'Pages': { 'type': 'string', 'index': 'not_analyzed' }, 
    }, 
} 

Фактическое отображение, ES отчеты:

'visits': { 
    'mappings': { 
    'visit': { 
     'properties': { 
     'Agent': {'type': 'string'}, 
     'Entrance Time': {'format': 'dateOptionalTime', 'type': 'date'}, 
     'Pages': {'type': 'string'}, 
     'Raw': { 
      'properties': { 
      'Entrance Time': {'type': 'double'}, 
      'domain': {'type': 'string'}, 
      'uniqID': {'type': 'string'} 
      } 
     }, 
     'Referrer': {'type': 'string'}, 
     'Request Time': {'format': 'dateOptionalTime', 'type': 'date'}, 
     'Srvr IP': {'type': 'string'}, 
     'Visitor IP': {'type': 'string'}, 
     'domain': {'type': 'string'}, 
     'uniqID': {'type': 'string'} 
     } 
    } 
    } 
} 

Когда я сбросить свои данные испытаний в ES и посмотреть его в Кибане4 есть проблемы. На вкладке «Обнаружение» он показывает мне «Быстрый счет» из 5 лучших агентов с усеченной версией полной строки. Однако, когда я создаю визуализацию (Visualize-> Pie Chart-> From new search-> Split Slices), используя термины в агрегировании и Agetn в поле, я получаю пятерку лучших как список отдельных слов - список - mozilla, 5.0 , совместимый, http, 2.0.

Kibana предупреждает меня, что поле Agent анализируется, несмотря на то, что я говорю ему, чтобы он не анализировал это поле в сопоставлении.

Я новичок в этом, я ошибаюсь, полагая, что если агент не был проанализирован, он будет рассчитывать на полную строку агента? Замена пробелов символами подчеркивания не исправила это. Итак, как я могу это исправить? Есть ли способ поместить Агенту в ES, чтобы он рассматривался только как целое?

Спасибо

Полный код отображения можно найти на этом question.

------- Mapping после Curl --------

Я использовал curl --request PUT 'http://127.0.0.1:9200/visits/_mapping/visit?ignore_conflicts=true' --data '{"visit" : { "properties" : { "Agent" : { "type" : "string", "index" : "not_analyzed" } } } }', чтобы изменить отображение и это новое отображение:

{ 
    "visits" : { 
    "mappings" : { 
     "visit" : { 
     "properties" : { 
      "Agent" : { 
      "type" : "string", 
      "norms" : { 
       "enabled" : false 
      } 
      }, 
      "Entrance Time" : { 
      "type" : "date", 
      "format" : "dateOptionalTime" 
      }, 
      "Pages" : { 
      "type" : "string" 
      }, 
      "Raw" : { 
      "properties" : { 
       "Entrance Time" : { 
       "type" : "double" 
       }, 
       "domain" : { 
       "type" : "string" 
       }, 
       "uniqID" : { 
       "type" : "string" 
       } 
      } 
      }, 
      "Referrer" : { 
      "type" : "string" 
      }, 
      "Request Time" : { 
      "type" : "date", 
      "format" : "dateOptionalTime" 
      }, 
      "Srvr IP" : { 
      "type" : "string" 
      }, 
      "Visitor IP" : { 
      "type" : "string" 
      }, 
      "domain" : { 
      "type" : "string" 
      }, 
      "uniqID" : { 
      "type" : "string" 
      } 
     } 
     } 
    } 
    } 
} 
+0

Можете ли вы показать, как вы добавили свое сопоставление в свой индекс? Также меня бы интересовали реальные значения за «Visit_to_ElasticSearch.INDEX'. – Val

ответ

0

Это такая же проблема, как и this other issue, и причина, по которой она не работает, связана с тем фактом, что отображение visit_mapping никогда не устанавливалось через put_mapping. Следовательно, ES создал свое собственное сопоставление, основанное на том, что было отправлено в документе visit.

Чтобы решить эту проблему, просто позвоните put_mapping с вашим картографированием до с индексированием вашего первого visit документа.

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