Заставить elasticsearch возвращать только определенные поля?
Я использую elasticsearch для индексирования Моих документов.
можно ли поручить ему возвращать только определенные поля вместо всего документа json, который он сохранил?
10 ответов:
Ага! Используйте источник фильтр. Если вы ищете с JSON это будет выглядеть примерно так:
{ "_source": ["user", "message", ...], "query": ..., "size": ... }
в ES 2.4 и ранее, вы также можете использовать опция поля для поиска API:
{ "fields": ["user", "message", ...], "query": ..., "size": ... }
это устарело в ES 5+. И исходные фильтры более мощные в любом случае!
Я нашел документы на
get api
чтобы быть полезным - особенно в двух разделах, источник фильтрации и поля: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-get.htmlОни заявляют о фильтрации источник:
Если вам нужно только одно или два поля из полного _source, вы можете используйте параметры _source_include & _source_exclude для включения или отфильтруйте то, что разделяет вас необходимость. Это может быть особенно полезно с большие документы, где частичное извлечение может сэкономить на сетевых накладных расходов
который идеально подходит для моего случая использования. Я закончил тем, что просто фильтровал источник так (используя стенографию):
{ "_source": ["field_x", ..., "field_y"], "query": { ... } }
FYI, они заявляют в документах о поля:
операция get позволяет указать набор сохраненных полей, которые будут возвращается путем передачи полей параметр.
Он, кажется, обслуживает поля, которые были специально сохранены, где он помещает каждое поле в массив. Если указанные поля не были сохранены, он будет извлекать каждый из _source, что может привести к "более медленным" извлечениям. У меня также возникли проблемы с попыткой заставить его возвращать поля типа object.
For the ES versions 5.X and above you can a ES query something like this GET /.../... { "_source": { "includes": [ "FIELD1", "FIELD2", "FIELD3" ... " ] }, . . . . }
все API-интерфейсы REST принимать параметр filter_path, которые могут быть использованы для уменьшите ответ, возвращенный elasticsearch. Этот параметр принимает список фильтров, разделенных запятыми, выражается точечной нотацией.
В Elasticsearch 5.x вышеупомянутый подход является устаревшим. Вы можете использовать подход _source, но в некоторых ситуациях может иметь смысл хранить поле. Например, если у вас есть документ с заголовком, датой и очень большим полем содержимого, вы можете получить только заголовок и дату, не извлекая эти поля из большого поля _source:
в этом случае можно использовать:
{ "size": $INT_NUM_OF_DOCS_TO_RETURN, "stored_fields":[ "doc.headline", "doc.text", "doc.timestamp_utc" ], "query":{ "bool":{ "must":{ "term":{ "doc.topic":"news_on_things" } }, "filter":{ "range":{ "doc.timestamp_utc":{ "gte":1451606400000, "lt":1483228800000, "format":"epoch_millis" } } } } }, "aggs":{ } }
смотрите документацию о том, как индексировать сохраненные поля. Всегда рады на сайте!
да с помощью исходного фильтра вы можете сделать это, вот doc source-filtering
Пример Запроса
POST index_name/_search { "_source":["field1","filed2".....] }
выход будет
{ "took": 57, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 1, "max_score": 1, "hits": [ { "_index": "index_name", "_type": "index1", "_id": "1", "_score": 1, "_source": { "field1": "a", "field2": "b" }, { "field1": "c", "field2": "d" },.... } ] } }
вот еще одно решение, теперь с помощью матч выражение
источник фильтрации
Позволяет контролировать, как поле _source возвращается с каждым ударом.протестировано с Elastiscsearch версии 5.5
ключевое слово "включает" определяет поля специфику.
GET /my_indice/my_indice_type/_search { "_source": { "includes": [ "my_especific_field"] }, "query": { "bool": { "must": [ {"match": { "_id": "%my_id_here_without_percent%" } } ] } } }
here you can specify whichever field you want in your output and also which you don't. POST index_name/_search { "_source": { "includes": [ "field_name", "field_name" ], "excludes": [ "field_name" ] }, "query" : { "match" : { "field_name" : "value" } } }
в java вы можете использовать setFetchSource следующим образом:
client.prepareSearch(index).setTypes(type) .setFetchSource(new String[] { "field1", "field2" }, null)
запрос REST API GET может быть выполнен с параметром '_source'.
Пример Запроса
http://localhost:9200/opt_pr/_search?q=SYMBOL:ITC AND OPTION_TYPE=CE AND TRADE_DATE=2017-02-10 AND EXPIRY_DATE=2017-02-23&_source=STRIKE_PRICE
ответ
{ "took": 59, "timed_out": false, "_shards": { "total": 5, "successful": 5, "failed": 0 }, "hits": { "total": 104, "max_score": 7.3908954, "hits": [ { "_index": "opt_pr", "_type": "opt_pr_r", "_id": "AV3K4QTgNHl15Mv30uLc", "_score": 7.3908954, "_source": { "STRIKE_PRICE": 160 } }, { "_index": "opt_pr", "_type": "opt_pr_r", "_id": "AV3K4QTgNHl15Mv30uLh", "_score": 7.3908954, "_source": { "STRIKE_PRICE": 185 } }, { "_index": "opt_pr", "_type": "opt_pr_r", "_id": "AV3K4QTgNHl15Mv30uLi", "_score": 7.3908954, "_source": { "STRIKE_PRICE": 190 } }, { "_index": "opt_pr", "_type": "opt_pr_r", "_id": "AV3K4QTgNHl15Mv30uLm", "_score": 7.3908954, "_source": { "STRIKE_PRICE": 210 } }, { "_index": "opt_pr", "_type": "opt_pr_r", "_id": "AV3K4QTgNHl15Mv30uLp", "_score": 7.3908954, "_source": { "STRIKE_PRICE": 225 } }, { "_index": "opt_pr", "_type": "opt_pr_r", "_id": "AV3K4QTgNHl15Mv30uLr", "_score": 7.3908954, "_source": { "STRIKE_PRICE": 235 } }, { "_index": "opt_pr", "_type": "opt_pr_r", "_id": "AV3K4QTgNHl15Mv30uLw", "_score": 7.3908954, "_source": { "STRIKE_PRICE": 260 } }, { "_index": "opt_pr", "_type": "opt_pr_r", "_id": "AV3K4QTgNHl15Mv30uL5", "_score": 7.3908954, "_source": { "STRIKE_PRICE": 305 } }, { "_index": "opt_pr", "_type": "opt_pr_r", "_id": "AV3K4QTgNHl15Mv30uLd", "_score": 7.381078, "_source": { "STRIKE_PRICE": 165 } }, { "_index": "opt_pr", "_type": "opt_pr_r", "_id": "AV3K4QTgNHl15Mv30uLy", "_score": 7.381078, "_source": { "STRIKE_PRICE": 270 } } ] }
}