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

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

Какая цель?

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

Понятно - оптимизация пересылки между elasticsearch и клиентом. Тогда можно в скрипте отрезать.

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

{
  "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\"]"}
    }
}

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

Может, сначала params[\"_source\"][\"body\"] переменной присвоить?

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

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

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

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

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