2016-05-23 2 views
1

Вопрос: Есть ли способ очистить html от источника документа? Удаление дескриптора html может быть периодическим, инициированным или идеально на лету, поскольку оно индексируется.Как изменить поле источника документа Elasticsearch

У меня есть данные, полученные в elasticsearch, индексируются против анализатора, который удаляет ненужные теги htmls перед его индексом.

On Queries/Получает поле _source с исходным контентом, в котором есть htmls, который возвращается клиентам.

Примечание:

  • Я не могу очистить данные перед передачей elasticsearch, у меня нет контроля над этим.
  • Мои клиенты, получающие данные из elasticsearch, могут выполнить удаление с помощью javascript перед представлением данных, но не вариант.
+0

Использование 'transform' вы можете редактировать/изменять' _source': https://www.elastic.co/guide/en/elasticsearch/reference/2.3/ отображение-transform.html. Но учтите, что он устарел, начиная с 2.0.0 без замены. –

+0

Спасибо @ andrei-stefan, Идеально не через устаревшие средства. Также обратите внимание, что в документации 'transform' результат не сохраняется в источнике. – DaddyMoe

+0

Вы не можете изменить _source. Источник содержит ваши данные, которые вы вводите в поиск elastics. Все сопоставления, которые вы определили, установлены на ваш входной объект json, но они не изменяют _source. –

ответ

1

_source просто хранит индекс JSON, который был проиндексирован. Вы не можете его изменить.

Теперь, если вы хотите полностью удалить html перед индексированием и сохранением содержимого как есть, вы можете использовать плагин привязки mapper, в котором, когда вы определяете сопоставление, вы можете классифицировать content_type как «html. "

Приложение mapper полезно для многих вещей, особенно если вы работаете с несколькими типами документов, но в первую очередь - я считаю, что просто использовать это с целью удаления html-тегов достаточно (что вы не можете сделать с html_strip char).

Просто предупреждение, хотя - НИКАКИЕ тэги html будут сохранены. Поэтому, если вам действительно нужны эти теги, я бы предложил задать другое поле для хранения исходного содержимого. Еще одно примечание. Вы не можете указывать многопользовательские документы для вложений документов mapper, поэтому вам нужно будет хранить это вне документа привязки mapper. См. Мой рабочий пример ниже.

Вам нужно привести к этому отображению:

{ 
    "html5-es" : { 
    "aliases" : { }, 
    "mappings" : { 
     "document" : { 
     "properties" : { 
      "delete" : { 
      "type" : "boolean" 
      }, 
      "file" : { 
      "type" : "attachment", 
      "fields" : { 
       "content" : { 
       "type" : "string", 
       "store" : true, 
       "term_vector" : "with_positions_offsets", 
       "analyzer" : "autocomplete" 
       }, 
       "author" : { 
       "type" : "string", 
       "store" : true, 
       "term_vector" : "with_positions_offsets" 
       }, 
       "title" : { 
       "type" : "string", 
       "store" : true, 
       "term_vector" : "with_positions_offsets", 
       "analyzer" : "autocomplete" 
       }, 
       "name" : { 
       "type" : "string" 
       }, 
       "date" : { 
       "type" : "date", 
       "format" : "strict_date_optional_time||epoch_millis" 
       }, 
       "keywords" : { 
       "type" : "string" 
       }, 
       "content_type" : { 
       "type" : "string" 
       }, 
      "content_length" : { 
       "type" : "integer" 
       }, 
       "language" : { 
       "type" : "string" 
       } 
      } 
      }, 
      "hash_id" : { 
      "type" : "string" 
      }, 
      "path" : { 
      "type" : "string" 
      }, 
      "raw_content" : { 
      "type" : "string", 
      "store" : true, 
      "term_vector" : "with_positions_offsets", 
      "analyzer" : "raw" 
      }, 
      "title" : { 
      "type" : "string" 
      } 
     } 
     } 
    }, 
    "settings" : { //insert your own settings here }, 
    "warmers" : { } 
    } 
} 

Такое, что в НЕСТ, соберу содержание как таковое:

Attachment attachment = new Attachment(); 
attachment.Content = Convert.ToBase64String(File.ReadAllBytes("path/to/document")); 
attachment.ContentType = "html"; 

Document document = new Document(); 
document.File = attachment; 
document.RawContent = InsertRawContentFromString(originalText); 

Я испытал это в смысле - результаты следующим образом:

"file": { 
    "_content": "PGh0bWwgeG1sbnM6TWFkQ2FwPSJodHRwOi8vd3d3Lm1hZGNhcHNvZnR3YXJlLmNvbS9TY2hlbWFzL01hZENhcC54c2QiPg0KICA8aGVhZCAvPg0KICA8Ym9keT4NCiAgICA8aDE+VG9waWMxMDwvaDE+DQogICAgPHA+RGVsZXRlIHRoaXMgdGV4dCBhbmQgcmVwbGFjZSBpdCB3aXRoIHlvdXIgb3duIGNvbnRlbnQuIENoZWNrIHlvdXIgbWFpbGJveC48L3A+DQogICAgPHA+wqA8L3A+DQogICAgPHA+YXNkZjwvcD4NCiAgICA8cD7CoDwvcD4NCiAgICA8cD4xMDwvcD4NCiAgICA8cD7CoDwvcD4NCiAgICA8cD5MYXZlbmRlci48L3A+DQogICAgPHA+wqA8L3A+DQogICAgPHA+MTAvNiAxMjowMzwvcD4NCiAgICA8cD7CoDwvcD4NCiAgICA8cD41IDA5PC9wPg0KICAgIDxwPsKgPC9wPg0KICAgIDxwPjExIDQ3PC9wPg0KICAgIDxwPsKgPC9wPg0KICAgIDxwPkhhbGxvd2VlbiBpcyBpbiBPY3RvYmVyLjwvcD4NCiAgICA8cD7CoDwvcD4NCiAgICA8cD5qb2c8L3A+DQogIDwvYm9keT4NCjwvaHRtbD4=", 
    "_content_length": 0, 
    "_content_type": "html", 
    "_date": "0001-01-01T00:00:00", 
    "_title": "Topic10" 
}, 
"delete": false, 
"raw_content": "<h1>Topic10</h1><p>Delete this text and replace it with your own content. Check your mailbox.</p><p> </p><p>asdf</p><p> </p><p>10</p><p> </p><p>Lavender.</p><p> </p><p>10/6 12:03</p><p> </p><p>5 09</p><p> </p><p>11 47</p><p> </p><p>Halloween is in October.</p><p> </p><p>jog</p>" 
}, 
"highlight": { 
"file.content": [ 
    "\n <em>Topic10</em>\n\n Delete this text and replace it with your own content. Check your mailbox.\n\n  \n\n asdf\n\n  \n\n 10\n\n  \n\n Lavender.\n\n  \n\n 10/6 12:03\n\n  \n\n 5 09\n\n  \n\n 11 47\n\n  \n\n Halloween is in October.\n\n  \n\n jog\n\n " 
    ] 
} 
Смежные вопросы