Как индексировать дамп 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  "
    ]
}