Как индексировать дамп html-файлов в elasticsearch?
Я совершенно новый в Эластике, поэтому мои знания только от elasticsearch сайт и мне нужно помочь. Моя задача-индексировать данные больших строк в формате html в эластичный поиск. Я уже обыскал свои данные и сохранил их на диске (200 000 html-файлов). Мой вопрос в том, каков самый простой способ индексировать все html-файлы в elasticsearch? Должен ли я делать это вручную для каждого документа, чтобы сделать запрос put эластичным? Например, как:
curl -XPUT 'http://localhost:9200/registers/tomas/1' -d '{
"user" : "tomasko",
"post_date" : "2009-11-15T14:12:12",
"field 1" : "field data"
"field 2" : "field 2 data"
}'
и второй вопрос, если я необходимо проанализировать HTML-документ для получения данных для поля JSON 1, как в примере кода?
и, наконец, после индексирования могу ли я удалить все HTML-документы? Спасибо за все.
2 ответов
Я бы посмотрел на массовый api это позволяет отправлять больше документов в одном запросе, чтобы ускорить процесс индексирования. Вы можете отправить пакет из 10, 20 или более документов, в зависимости от их размера.
в зависимости от того, что вы хотите индексировать, вам может потребоваться проанализировать html, если вы не хотите индексировать весь html как одно поле (вы можете использовать html полосы char фильтр в этом случае, чтобы удалить теги html из индексированный текст).
после индексирования я бы предложил убедиться, что отображение правильное, и вы можете найти то, что ищете. Вы всегда можете переиндексировать с помощью _source специальное поле, которое elasticsearch хранит под капотом, но если вы уже написали свой код индексатора, вы можете использовать его снова для переиндексации при необходимости (конечно, с теми же html-документами). На практике вы никогда не индексируете свои данные один раз... так что будьте осторожны :) хотя elasticsearch всегда поможет вам вне поля _source), это просто вопрос запроса существующего индекса и переиндексирования всех его документов в другом индексе.
предложение@javanna посмотреть на массовый API, безусловно, приведет вас в правильном направлении. Если вы используете NEST, вы можете сохранить все свои объекты в списке, который затем можно сериализовать объекты 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 "
]
}