2013-04-04 3 views
1

Я пытаюсь запустить граненый запрос в некоторых журналах, которые я сохранил в ES. Бревна выглядят как-тоElasticsearch: Графический запрос с условиями, возвращающими неожиданный результат

{"severity": "informational","message_hash_value": "00016B15", "user-agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:15.0) Gecko/20100101 Firefox/15.0.1", "host": "192.168.8.225", "version": "1.0", "user": "[email protected]", "created_timestamp": "2013-03-01T15:34:00", "message": "User viewed contents", "inserted_timestamp": "2013-03-01T15:34:00"} 

запрос, который я пытаюсь запустить,

curl -XGET 'http://127.0.0.1:9200/logs-*/logs/_search' 
-d {"from":0, "size":0, 
    "facets" : { 
     "user" : { 
      "terms" : {"field" : "user", "size" : 999999 } } } } 

Обратите внимание, что поле "user" в журналах является адрес электронной почты. Теперь проблема в том, что используемый нами поисковый запрос terms-facet возвращает список терминов из поля users, как показано ниже.

u'facets': {u'user': {u'_type': u'terms', u'total': 2004, u'terms': [{u'count': 1002,u'term': u'test.co'}, {u'count': 320, u'term': u'user_1'}, {u'count': 295,u'term': u'user_2'} 

Обратите внимание, что этот список содержит term

{u'count': 1002,u'term': u'test.co'} 

который является доменным именем для адреса электронной почты пользователей. Почему elasticsearch обрабатывает домен как отдельный термин?

Выполнение запроса для проверки отображения

curl -XGET 'http://127.0.0.1:9200/logs-*/_mapping?pretty=true' 

дает следующее за "user" поля

"user" : { 
     "type" : "string" 
    }, 

ответ

2

Это происходит потому, что elasticsearch по умолчанию глобального размечает анализатор «@» (в дополнении к вещам, как пробельные и пунктуация) во время индекса. Вы можете обойти эту проблему, сообщив elasticsearch, чтобы не запускать анализатор в этом поле, но вам придется переиндексировать все ваши данные.

Создать новый индекс

curl -XPUT 'http://localhost:9200/logs-new' 

Укажите в отображении этого нового индекса, что вы не хотите, чтобы анализировать поле «пользователь»

curl -XPUT 'http://localhost:9200/logs-new/logs/_mapping' -d '{ 
    "logs" : { 
     "properties" : { 
      "user" : { 
       "type" : "string", 
       "index" : "not_analyzed" 
      } 
     } 
    } 
}' 

индекс а документ

curl -XPOST 'http://localhost:9200/logs-new/logs' -d '{ 
    "created_timestamp": "2013-03-01T15:34:00", 
    "host": "192.168.8.225", 
    "inserted_timestamp": "2013-03-01T15:34:00", 
    "message": "User viewed contents", 
    "message_hash_value": "00016B15", 
    "severity": "informational", 
    "user": "[email protected]", 
    "user-agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:15.0) Gecko/20100101 Firefox/15.0.1", 
    "version": "1.0" 
}' 

Фаза поиска elastics теперь отображает весь адрес электронной почты

curl -XGET 'http://localhost:9200/logs-new/logs/_search?pretty' -d '{ 
    "from":0, 
    "size":0, 
    "facets" : { 
     "user" : { 
      "terms" : { 
       "field" : "user", 
       "size" : 999999 
      } 
     } 
    } 
}' 

Результат:

{ 
    "took" : 1, 
    "timed_out" : false, 
    "_shards" : { 
    "total" : 5, 
    "successful" : 5, 
    "failed" : 0 
    }, 
    "hits" : { 
    "total" : 1, 
    "max_score" : 1.0, 
    "hits" : [ ] 
    }, 
    "facets" : { 
    "user" : { 
     "_type" : "terms", 
     "missing" : 0, 
     "total" : 1, 
     "other" : 0, 
     "terms" : [ { 
     "term" : "[email protected]", 
     "count" : 1 
     } ] 
    } 
    } 
} 

Ссылки: Типы Core: http://www.elasticsearch.org/guide/reference/mapping/core-types/ индексированиями этого с новым отображением: https://groups.google.com/forum/?fromgroups#!topic/elasticsearch/tCaXgjfUFVU

+0

отличный ответ. +1 для ссылки и повторной индексации. ура – auny

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