2016-05-30 2 views
0

Я хочу индексировать 1 миллиард записей. каждая запись имеет 2 атрибута (атрибут1 и атрибут2). Каждая запись, имеющая такое же значение в атрибуте1, должна быть слиянием. например, у меня есть две записиПоиск после индексирования в ElasticSearch

attribute1 attribute2 
1 4 
1 6 

мой упругий документ должен быть

{ 
    "attribute1": "1" 
    "attribute2": "4,6" 
} 

из-за огромное количество данных, я должен прочитать большую часть (около 1000 записей) и объединить их на основе выше (в памяти), а затем искать их в ElasticSearch и объединить их с результатом поиска, а затем индексировать/переиндексировать их. Таким образом, я должен искать и индексировать соответственно. Я реализовал это правило, но в некоторых случаях Elastic не возвращает все результаты, а некоторые документы были проиндексированы дублирующимся образом. после каждого индекса I Обновите ElasticSearch, чтобы он был готов к следующему поиску. но в некоторых случаях это не работает. мои настройки индекса следует, как:

{ 
"test_index": { 
    "settings": { 
     "index": { 
      "refresh_interval": "-1", 
      "translog": { 
       "flush_threshold_size": "1g" 
      }, 
      "max_result_window": "1000000", 
      "creation_date": "1464577964635", 
      "store": { 
       "throttle": { 
        "type": "merge" 
       } 
      } 
     }, 
     "number_of_replicas": "0", 
     "uuid": "TZOse2tLRqGk-vHRMGc2GQ", 
     "version": { 
      "created": "2030199" 
     }, 
     "warmer": { 
      "enabled": "false" 
     }, 
     "indices": { 
      "memory": { 
       "index_buffer_size": "40%" 
      } 
     }, 
     "number_of_shards": "5", 
     "merge": { 
      "policy": { 
       "max_merge_size": "2g" 
      } 
     } 
    } 
} 

как я могу решить эту проблему?

Есть ли другие настройки для обработки этой ситуации?

ответ

0

В ваших насыпных командах, вам нужно использовать index операции для первого совпадения, а затем update со сценарием, чтобы обновить attribute2 свойства:

{ "index" : { "_index" : "test_index", "_type" : "test_type", "_id" : "1" } } 
{ "attribute1" : "1", "attribute2": [4] } 
{ "update" : { "_index" : "test_index", "_type" : "test_type", "_id" : "1" } } 
{ "script" : { "inline": "ctx._source.attribute2 += attr2", "params" : {"attr2" : 6}}} 

После первой index операции документ будет выглядеть

{ 
    "attribute1": "1" 
    "attribute2": [4] 
} 

После второй update операции, ваш документ будет выглядеть

{ 
    "attribute1": "1" 
    "attribute2": [4, 6] 
} 

Обратите внимание, что также можно использовать операции update с doc_as_upsert и script.

+0

мой вопрос, почему иногда, когда я индексирую данные и обновляю эластичные, и поиск на нем сразу, эластичный не возвращает результат? – Ghasem

+0

Как вы обновляете свой индекс? Я вижу, что ваш параметр refresh_interval равен -1, что означает «никогда не обновлять». – Val

+0

после объемного индексирования. Я вызываю обновление с помощью API. – Ghasem

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