Flatten elasti c поиск _источника - PullRequest
0 голосов
/ 27 марта 2020

У меня проблема с использованием Elasti c Поиск (ES) для получения JSON объекта. Прямо сейчас, когда я пытался использовать приведенное ниже тело запроса для запроса некоторых данных из ES,

"_source": [
    "data.id",
    "data.completed",
    "data.label",
    "data.url",
    "data.mobile"
],

"query": {
    ...
}

Я всегда получаю ответ в виде

{
    "took": 225,
    "timed_out": false,
    "_shards": {
        ...
    },
    "hits": {
        "total": {
            ...
        },
        "max_score": null,
        "hits": [
            {
                ...

                "_source": {
                    "data": {
                        "mobile": 1,
                        "label": "EU Mobile Test",
                        "completed": 1582990420,
                        "id": "2002",
                        "url": "http://www.example.com/"
                    }
                },

                ...
            },


          ...
        ]
    }
}

Есть ли способ, которым я мог бы получить JSON информацию о детях напрямую через тело запроса? так что ответ будет примерно таким:

 {
    "took": 225,
    "timed_out": false,
    "_shards": {
        ...
    },
    "hits": {
        "total": {
            ...
        },
        "max_score": null,
        "hits": [
            {
                ...

                "_source": {
                        "mobile": 1,
                        "label": "EU Mobile Test",
                        "completed": 1582990420,
                        "id": "2002",
                        "url": "http://www.example.com/"
                },

                ...
            },


          ...
        ]
    }
}

1 Ответ

0 голосов
/ 27 марта 2020

Вы не можете изменить способ структурирования атрибута _source в hit, за исключением ограничения того, что возвращается с помощью _source, как вы это сделали.


Вы можете взломать, используя скажем, скриптовые поля:

GET biao/_search
{
  "_source": "extracted_data",
  "script_fields": {
    "extracted_data": {
      "script": {
        "source": """
        def map = [:];
        for (def field : params['data_fields']) {
          try {
            map[field] = doc['data.' + field].value;  
          } catch(Exception e){
            try {
              map[field] = doc['data.' + field + '.keyword'][0];  
            } catch(Exception ee) {

            }
          }
        }
        return map;

        """,
        "params": {
          "data_fields": [
            "mobile",
            "label",
            "completed",
            "id",
            "url"
          ]
        }
      }
    }
  }
}

, что дает

"hits" : [
      {
        "_index" : "biao",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : { },
        "fields" : {
          "extracted_data" : [
            {
              "mobile" : 1,
              "label" : "EU Mobile Test",
              "completed" : 1582990420,
              "id" : "2002",
              "url" : "http://www.example.com/"
            }
          ]
        }
      }
    ]

, но теперь у вас возникла новая проблема, потому что вам нужно получить доступ к данным с помощью fields.extracted_data[0];).

Прочитайте документы reda sh еще раз - должен быть более чистый способ сделать это!

...