Ingest Attachments plugin & Highlighting

Добрый день!

Существует следующая задача:
Имеется такой документ:

{
    "Files": [
        {
            "Name": "first.pdf",
            "Content": "base64 строка",
            "Id": "906fe807-8a78-4918-91ee-96307c21dd7c"
        },
        {
            "Name": "second.txt",
            "Content": "другая base64 строка",
            "Id": "b71f1d18-e185-4d9a-bd0e-9ae94ec4bd6f"
        }
    ]
}

Необходимо:

  1. Проиндексировать его с помощью ingest-attachment плагина.
  2. Написать поисковый запрос, в ответе на который получим хайлайты по содержимому файлов, по которым можно понять какому файлу они соответствуют.

В версии Elasticsearch 2.* использовался плагин mapper-attachments, и эта проблема решалась индексированием файлов с различными именами полей.
То есть документ индексировался в таком формате:

{
    "Files": [
        {
            "File1": {
                "Name": "first.pdf",
                "Content": "base64 строка",
                "Id": "906fe807-8a78-4918-91ee-96307c21dd7c"
            }
        },
        {
            "File2": {
                "Name": "second.txt",
                "Content": "другая base64 строка",
                "Id": "b71f1d18-e185-4d9a-bd0e-9ae94ec4bd6f"
            }
        }
    ]
}

При использовании нового плагина непонятно как необходимо описать processor, чтобы было возможно индексировать массив объектов с различными именами.

Или, может быть, есть возможность написать такой поисковый запрос, с помощью которого можно решить эту задачу.

Буду очень благодарен за помощь!

Думаю, поисковым запросом это не решить...
Если взять готовый пример и добавить туда вот такой второй процессор, который тупо перемещает 2 поля:

    {
      "script": {
        "lang": "painless",
        "inline": """
            for (def i = 0; i < ctx.attachments.length; i++) {  
              def f = "File" + (i+1);
              ctx.attachments[i][f] = ctx.attachments[i].attachment;
              ctx.attachments[i][f].filename = ctx.attachments[i].filename;
              for (def rf : ['attachment', 'filename', 'data']) {
                ctx.attachments[i].remove(rf);
              }
            }
        """,
        "params": {}
      }
    }

то будет видно, где есть хайлайты:

GET my_index/my_type/_search
{
  "query": {
    "query_string": {
      "query": "test"
    }
  },
  "highlight": {
    "fields": {
      "*": {}
    },
    "require_field_match": false
  }
}

Результат:

...
        "highlight": {
          "attachments.File2.content": [
            "This is a <em>test</em>"
          ]
        }
...

Отличное решение! Большое спасибо за помощь!

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.