2015-05-25 3 views
1

(я делаю это с новой копией Elasticsearch 1.5.2)copy_to и пользовательский анализатор не работает

я определил пользовательский анализатор, и это работает:

curl -XPUT 127.0.0.1:9200/test -d '{ 
    "settings": { 
     "index": { 
     "analysis": { 
      "tokenizer": { 
      "UrlTokenizer": { 
       "type": "pattern", 
       "pattern": "https?://([^/]+)", 
       "group": 1 
      } 
      }, 
      "analyzer": { 
      "accesslogs": { 
       "tokenizer": "UrlTokenizer" 
      } 
      } 
     } 
    } 
    } 
}'; echo 

curl '127.0.0.1:9200/test/_analyze?analyzer=accesslogs&text=http://192.168.1.1/123?a=2#1111' | json_pp 

Теперь я применяю это индекс:

curl -XPUT 127.0.0.1:9200/test/accesslogs/_mapping -d '{ 
    "accesslogs" : { 
    "properties" : { 
     "referer" : { "type" : "string", "copy_to" : "referer_domain" }, 
     "referer_domain": { 
     "type":  "string", 
     "analyzer": "accesslogs" 
     } 
    } 
    } 
}'; echo 

Из сопоставления я вижу, что оба они применяются.

Теперь я пытаюсь вставить некоторые данные,

curl 127.0.0.1:9200/test/accesslogs/ -d '{ 
    "referer": "http://192.168.1.1/aaa.php", 
    "response": 100 
}';echo 

copy_to И поле, иначе referer_domain не был сгенерирован и если я пытаюсь добавить поле с таким именем, то токенизатор не применяется либо.

Любые идеи?

+0

В ваших журналах ES есть что-то актуальное, что вы можете нам показать? – Val

ответ

7

copy_to работает, но вы предполагаете, что, поскольку вы не видите генерируемое поле, его не существует.

Когда вы возвращаете свой документ назад (например, GET /test/accesslogs/1), вы не видите поле под _source. Он содержит нужный документ . И вы не указали ни одного поля referer_domain, только referer и response. И именно по этой причине вы этого не видите.

Но Elasticsearch действительно создает это поле в инвертированном индексе. Вы можете использовать его для запроса, вычисления или извлечения, если вы его сохранили.

Позвольте мне проиллюстрировать мои заявления:

  • вы можете запросить это поле, и вы получите результаты обратно на его основе. Если вы действительно хотите, чтобы увидеть то, что было сохранено в перевернутом индекса, вы можете сделать это:
GET /test/accesslogs/_search 
{ 
    "fielddata_fields": ["referer","response","referer_domain"] 
} 
  • вы можете, также, получить это поле, если вы хранится его:
"referer_domain": { 
    "type": "string", 
    "analyzer": "accesslogs", 
    "store" : true 
    } 

с этим:

GET /test/accesslogs/_search 
{ 
    "fields": ["referer","response","referer_domain"] 
} 

В заключение copy_to изменяет индексируется документ, а не источник документа. Вы можете запросить у ваших документов это поле, и оно будет работать, потому что запрос смотрит на инвертированный индекс. Если вы хотите получить это поле необходимо магазин это, также. Но вы не увидите это поле в поле _source, потому что _source - это начальный документ, который был проиндексирован.И исходный документ не содержит referer_domain.

+0

Спасибо, Андрей! Я успешно получил поле referer_domain, но это было то же самое, что и поле referer, результат из UrlTokenizer не присутствовал, я что-то упустил? – daisy

+0

Да, чтобы увидеть «анализатор» в действии, посмотрите на вывод 'fielddata_fields'. Это то, что попадает в инвертированный индекс и что является результатом анализа. –

+0

Да, это работает! Можно ли привести результат в поле источника? – daisy

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