2014-02-12 2 views
3

У меня есть данные этой формы:ElasticSearch - Dot в поле имя вложенного объекта

{ 
    "workers": { 
    "worker.1": { 
     "jobs": 1234 
    }, 
    }, 
    "total_jobs": 1234 
} 

и я пытаюсь разобраться с наличием «точку» в имени-поля. Я попробовал это отображение:

{ 
    "worker_stats": { 
    "properties": { 
     "workers": { 
     "type": "object", 
     "properties": { 
      "worker.1": { 
      "type": "nested", 
      "index_name": "worker_1", 
      "properties": { 
       "jobs": { 
       "type": "integer" 
       } 
      } 
      } 
     } 
     }, 
     "total_jobs": { 
     "type": "integer" 
     } 
    } 
    } 
} 

, но когда я за мое отображение, то index_name не-где видно, и когда я добавляю документ, он все еще есть точки.

В конце концов, я просто пытаюсь сделать некоторые агрегированные:

{ 
    "query": { 
    "filtered": { 
     "query": { 
     "match_all": {} 
     } 
    } 
    }, 
    "aggs": { 
    "worker1_stats": { 
     "aggs": { 
     "stats": { 
      "stats": { 
      "field": "workers.worker.1.jobs" 
      } 
     } 
     }, 
     "nested": { 
     "path": "workers.worker.1" 
     } 
    } 
    } 
} 

но точка мешает.

Что делать, чтобы справиться с этой точкой? Есть ли способ использовать script вместо field? (Это мое использование nested даже правильного

+0

Интересно, я просто попробовал это и отлично работает для не вложенных полей. 1.0.0 RC2 имеет поле '' copy_to''', которое может работать. [ссылка на ES doco на нем] (http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-core-types.html#copy-to) – mconlin

ответ

0

Я думаю, что вы можете использовать index_name, path и type : object в вашем отображении, чтобы изменить имя этого поля при индексировании

Вот мой пример:.

PUT /twitter/ 
{ 
    "settings" : { 
     "number_of_shards" : 5, 
     "number_of_replicas" : 0 
    }, 
    "mappings": { 
     "tweet":{ 
      "properties": { 
       "desc.youbet":{"type":"object","path":"just_name", 
       "properties": { 
        "one": { 
        "type": "integer", "index_name":"one" 
        } 
       } 
       } 
      } 
     } 
    } 
} 

PUT /twitter/tweet/1 
{ 
    "name":"chicken", 
    "desc.youbet":{ 
     "one":1, 
    } 
} 

PUT /twitter/tweet/2 
{ 
    "name":"chicken", 
    "desc.youbet":{ 
     "one":1, 
    } 
} 

Теперь вы можете использоваться DESC делать операции и искать то, что был один в документе так это:

POST /twitter/tweet/_search 
{ 
    "query": {"match_all": {}}, 
    "aggs":{ 
     "stats": { 
      "stats": {"field": "one"} 
     } 
    }, "size":0 
} 

Результаты примерно в таком виде:

{ 
    "took": 2, 
    "timed_out": false, 
    "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 2, 
     "max_score": 0, 
     "hits": [] 
    }, 
    "aggregations": { 
     "stats": { 
     "count": 2, 
     "min": 1, 
     "max": 1, 
     "avg": 1, 
     "sum": 2 
     } 
    } 
} 
Смежные вопросы