Я использую elasticsearch для индексации моих документов.
Можно ли инструктировать его только возвращать определенные поля вместо всего документа json, который он сохранил?
Я использую elasticsearch для индексации моих документов.
Можно ли инструктировать его только возвращать определенные поля вместо всего документа json, который он сохранил?
Ага! Используйте исходный фильтр. Если вы ищете с помощью JSON, это будет выглядеть примерно так:
{
"_source": ["user", "message", ...],
"query": ...,
"size": ...
}
В ES 2.4 и более ранних версиях вы также можете использовать опцию fields в API поиска:
{
"fields": ["user", "message", ...],
"query": ...,
"size": ...
}
Это устарело в ES 5+. И исходные фильтры в любом случае более мощные!
Я нашел документы для get api
полезными - особенно два раздела, Фильтрация источника и Поля: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-get.html
Они указывают на фильтрацию источника:
Если вам нужно только одно или два поля из полного источника, вы можете используйте параметры _source_include и _source_exclude для включения или отфильтруйте те части, которые вам нужны. Это может быть особенно полезно с большие документы, где частичный поиск может сэкономить на сетевых ресурсах
Что отлично подходит для моего использования. Я закончил просто фильтровать источник так (используя сокращенную версию):
{
"_source": ["field_x", ..., "field_y"],
"query": {
...
}
}
FYI, они заявляют в документах о параметре fields:
Операция get позволяет указать набор сохраненных полей, которые будут возвращаемый путем передачи параметров полей.
Кажется, он обслуживает поля, которые были специально сохранены, где он помещает каждое поле в массив. Если указанные поля не были сохранены, они будут извлекать каждый из источника _source, что может привести к "более медленным" результатам поиска. У меня также возникли проблемы с попыткой вернуть его для объектов типа типа.
Итак, у вас есть два варианта, будь то фильтрация источника или [сохраненные] поля.
For the ES versions 5.X and above you can a ES query something like this
GET /.../...
{
"_source": {
"includes": [ "FIELD1", "FIELD2", "FIELD3" ... " ]
},
.
.
.
.
}
В Elasticsearch 5.x вышеупомянутый подход устарел. Вы можете использовать подход _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":{
}
}
См. документацию о том, как индексировать сохраненные поля. Всегда рад за Upvote!
Все REST API принимают параметр filter_path, который можно использовать для уменьшения ответа, возвращаемого эластичным поиском. Этот параметр принимает список фильтров, разделенных запятыми, с точечной нотацией.
Вот еще одно решение, теперь с помощью выражения матча
Исходная фильтрация
Позволяет контролировать, как поле _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" }
}
}
Запрос 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
}
}
]
}
}
Да, с помощью исходного фильтра вы можете сделать это, вот документация по исходной фильтрации
Пример запроса
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"
},....
}
]
}
}
В java вы можете использовать setFetchSource следующим образом:
client.prepareSearch(index).setTypes(type)
.setFetchSource(new String[] { "field1", "field2" }, null)
Например, у вас есть документ с тремя полями:
PUT moive/_doc/1
{
"name":"The Lion King",
"language":"English",
"score":"9.3"
}
если вы хотите вернуть name
и score
вы можете использовать следующую команду:
GET moive/_doc/1?_source_includes=name,score
Если вы хотите получить какое-то поле с шаблоном:
GET moive/_doc/1?_source_includes=*re
Может быть, кроме некоторых полей:
GET moive/_doc/1?_source_excludes=score