Как я могу отфильтровать ответы эластичного поиска от тела запроса, а не от URL запроса? - PullRequest
0 голосов
/ 08 июля 2019

Я ищу в индексеasticsearch (v7.1), используя NEST, и мне нужны только идентификаторы возвращенных документов. Это может быть выполнено с помощью следующего URI запроса в kibana:

Запрос

GET exampleindex/_search?filter_path=hits.hits._id

Ответ

{
  "hits" : {
    "hits" : [
      {
        "_id" : "123"
      }
    ]
  }
}

Вопрос

Как я могу выполнить то же самое через тело запроса, не передавая параметры строки запроса?

Я надеюсь на что-то вроде этого:

GET exampleindex/_search
{
  "filter_path": "hits.hits._id"
}

Но это не работает:

{
  "error": {
    "root_cause": [
      {
        "type": "parsing_exception",
        "reason": "Unknown key for a VALUE_STRING in [filter_path].",
        "line": 2,
        "col": 18
      }
    ],
    "type": "parsing_exception",
    "reason": "Unknown key for a VALUE_STRING in [filter_path].",
    "line": 2,
    "col": 18
  },
  "status": 400
}

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 09 июля 2019

На самом деле параметр filter_path может использоваться для уменьшения ответа, возвращаемого Elasticsearch. Так работает с

GET exampleindex/_search?filter_path=hits.hits._id

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

Если вы используете source: false, как показано ниже, вы получите метаданные _index, _type, _id, _score, которые должны быть возвращены эластичным поиском.

N.B: В настоящее время нет способа удалить эти метаданные из ответа

GET exampleindex/_search
{
   "query": {
      "match_all": {}
   },
   "_source": false
}

Итак. Если вы используете какой-либо язык на стороне сервера, например, python / php или любой другой, вы можете отфильтровать идентификатор только в массиве / списке. Для примера:

import elasticsearch
es = elasticsearch.Elasticsearch()

res = es.search(
    index=your_index, 
    body={"query": {"match_all": {}}, "size": 10, "fields": ["_id"]})

ids = [d['_id'] for d in res['hits']['hits']]
print(ids) # it will contain only the ids
0 голосов
/ 08 июля 2019

Вы можете использовать фильтрацию источника :

GET /_search
{
    "_source": false
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...