# Как при поиске отдать только первые N-байт тексового поля?

**URL:** https://discuss.elastic.co/t/n/210375
**Category:** Вопросы на русском языке
**Created:** [December 3, 2019, 2:51pm UTC](https://discuss.elastic.co/t/n/210375 "2019-12-03T14:51:17Z")
**Posts on this page:** 10
**Page:** 1

<div class="post-metadata">

### Author: ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)
#### Post date: [December 3, 2019, 2:51pm UTC](https://discuss.elastic.co/t/n/210375/1 "2019-12-03T14:51:17Z")

</div>

Т.е. из \_source надо взять не всё поле, а только начало. Пока получается только при индексации создавать поле, но это мне не нравится.

---

<div class="post-metadata">

### Author: ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)
#### Post date: [December 3, 2019, 4:19pm UTC](https://discuss.elastic.co/t/n/210375/2 "2019-12-03T16:19:56Z")

</div>

Какая цель?

---

<div class="post-metadata">

### Author: ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)
#### Post date: [December 3, 2019, 5:38pm UTC](https://discuss.elastic.co/t/n/210375/3 "2019-12-03T17:38:54Z")

</div>

Поиск ведется по нескольким полям. В том числе по содержимому документа. Если найдено по содержимому надо отдать хайлатер, иначе (найдено по другим полям) просто отдать первый абзац документа (Так сказать, для ознакомления, чтобы был понятен контент документа). Поле текстовое и может быть достаточно большим, поэтому просто всё поле отдать, тоже не очень хорошо.

---

<div class="post-metadata">

### Author: ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)
#### Post date: [December 3, 2019, 6:04pm UTC](https://discuss.elastic.co/t/n/210375/4 "2019-12-03T18:04:35Z")

</div>

Понятно - оптимизация пересылки между elasticsearch и клиентом. Тогда можно в [скрипте](https://www.elastic.co/guide/en/elasticsearch/reference/7.4/search-request-body.html#request-body-search-script-fields) отрезать.

---

<div class="post-metadata">

### Author: ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)
#### Post date: [December 20, 2019, 11:09am UTC](https://discuss.elastic.co/t/n/210375/5 "2019-12-20T11:09:59Z")

</div>

Извиняюсь. Отвлекся. 🙂  
Всё вроде получилось. Но поле текстовое и непонятной длины, поэтому приходится его брать из \_source и проверять длину, чтобы не падал запрос при короткой строке. Получилось примерно следующее:

```auto
{
  "query" : {"match": {"body":"ceph"}},
  "highlight" : {"fields":{"body":{}}},
  "_source":{"includes":["name","is_parent"]},
  "script_fields" : {
    "bodypreview": {"script" : "params[\"_source\"][\"body\"].length()>10?params[\"_source\"][\"body\"].substring(0,10):params[\"_source\"][\"body\"]"}
    }
}

```

Можно это как то более элегантно выразить?

---

<div class="post-metadata">

### Author: ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)
#### Post date: [December 20, 2019, 2:11pm UTC](https://discuss.elastic.co/t/n/210375/6 "2019-12-20T14:11:05Z")

</div>

Может, сначала `params[\"_source\"][\"body\"]`[переменной](https://www.elastic.co/guide/en/elasticsearch/painless/current/painless-variables.html) присвоить?

---

<div class="post-metadata">

### Author: ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)
#### Post date: [December 20, 2019, 5:55pm UTC](https://discuss.elastic.co/t/n/210375/7 "2019-12-20T17:55:00Z")

</div>

Тогда не понял, как оно работает. Я думал одно выражение присваивается полю.

---

<div class="post-metadata">

### Author: ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)
#### Post date: [December 20, 2019, 6:20pm UTC](https://discuss.elastic.co/t/n/210375/8 "2019-12-20T18:20:01Z")

</div>

Да. Но это выражение можно возвратить через `return ....;`

---

<div class="post-metadata">

### Author: ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)
#### Post date: [December 25, 2019, 11:59am UTC](https://discuss.elastic.co/t/n/210375/9 "2019-12-25T11:59:07Z")

</div>

Спасибо. Всё получилось.

```auto
"script_fields" : {
   "bodypreview": {"script" : "int l=100;String s=params[\"_source\"][\"body\"]; return s.length()>l?s.substring(0,l):s"}
   }

```

---

<div class="post-metadata">

### Author: ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)
#### Post date: [January 22, 2020, 11:59am UTC](https://discuss.elastic.co/t/n/210375/10 "2020-01-22T11:59:22Z")

</div>

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