# Как в фильтре поиска проверять размер поля?

**URL:** https://discuss.elastic.co/t/topic/242934
**Category:** Вопросы на русском языке
**Created:** [July 28, 2020, 4:09pm UTC](https://discuss.elastic.co/t/topic/242934 "2020-07-28T16:09:08Z")
**Posts on this page:** 5
**Page:** 1

<div class="post-metadata">

### Author: ![IlyaEvseev](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/ilyaevseev/32/72934_2.png) [@IlyaEvseev](https://discuss.elastic.co/u/IlyaEvseev)
#### Post date: [July 28, 2020, 4:09pm UTC](https://discuss.elastic.co/t/topic/242934/1 "2020-07-28T16:09:08Z")

</div>

Имеется ElasticSearch 7.3.2  
Внутри него есть индекс с полем "message" типа "text".

Пытаюсь найти в нём документы, в которых поле имеет большую длину:

```auto
curl -XPOST -H 'Content-Type: application/json' -d '
{
  "query": {
    "bool": {
      "filter": {
        "script": {
          "script": {
            "source": "doc['message'].toString().length() > 10000,
            "lang": "painless"
          }
        }
      }
    }
  },
  "script_fields": {
    "A": { "script": { "lang": "painless", "source": "params._source.message.toString().length()" } },
    "B": { "script": { "lang": "painless", "source": "doc['message'].toString().length()" } },
    "C": { "script": { "lang": "painless", "source": "doc['message'].length" } },
    "D": { "script": { "lang": "painless", "source": "doc['message'].size()" } }
  }
}
' "127.0.0.1:9200/myindex/_search?pretty=true"

```

Результат:

```auto
"fields" : {
  "A" : [2155780],
  "B" : [13206],
  "D" : [1514],
  "C" : [1514]
}

```

Верное значение содержится только в поле "A". Но его невозможно использовать для поиска, потому что query filter не знает про \_source.

Вопросы:

1. Что содержат значения B и C? Почему значения A,B,C разные?
2. Как узнать размер поля в query filter?

---

<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: [July 28, 2020, 6:42pm UTC](https://discuss.elastic.co/t/topic/242934/2 "2020-07-28T18:42:46Z")

</div>

> Что содержат значения B и C? Почему значения A,B,C разные?

A - содержит размер исходной строки  
B - содержит в себе список всех уникальных токенов (слов) в алфавитном порядке. То есть, если исходная строка была `Что в лоб, что по лбу` то мы будем считать длину строки `[в, лбу, лоб, по, что]` в случае стандартного анилизатора или `[лбу, лоб]`, если анализатор удаляет русские шумовые слова.  
C - это размер массива, про который мы рассматривали в B  
D - тоже, что и C

> Как узнать размер поля в query filter?

Во время выполнения запроса, это информация недоступна так как она отсутствует в индексе. Нужно либо переиндексировать, либо делать update\_by\_query по всему индексу.

Какой конечный результат нужен?

---

<div class="post-metadata">

### Author: ![IlyaEvseev](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/ilyaevseev/32/72934_2.png) [@IlyaEvseev](https://discuss.elastic.co/u/IlyaEvseev)
#### Post date: [July 29, 2020, 1:33pm UTC](https://discuss.elastic.co/t/topic/242934/3 "2020-07-29T13:33:50Z")

</div>

> Какой конечный результат нужен?

Список \_docid и размеров для документов, поле message в которых занимает больше мегабайта (и поэтому Кибана отказывается с ними работать).

В SQL это выглядело бы так:

```auto
delete from myIndex where length(message) > 1000000;

```

Сейчас делаю для этого полный перебор индекса:

```auto
curl -XPOST -H 'Content-Type: application/json' -sS -d '
{
    "from" : 0,
    "size" : 10000,
    "query": { "match_all": {} },
    "script_fields": {
        "A": { "script": { "lang": "painless", "source": "params._source.message.toString().length()" } }
    }
}
' "127.0.0.1:9200/myIndex/_search?pretty=true" |
jq -jr '.hits.hits[] | ._id, " ", .fields.A[0], "\n"' |
while read docid sz; do
    test "$sz" -ge 500000 && curl -sS -XDELETE "127.0.0.1:9200/myIndex/_doc/$docid?pretty=true"
done

```

В качестве временного решения такой вариант меня устраивает, но на будущее хотелось бы разобраться.

---

<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: [July 29, 2020, 2:01pm UTC](https://discuss.elastic.co/t/topic/242934/4 "2020-07-29T14:01:15Z")

</div>

> [@IlyaEvseev](#):
>
> но на будущее хотелось бы разобраться.

На будущее, я бы пропустил записи через [ingest processor](https://www.elastic.co/guide/en/elasticsearch/reference/7.6/script-processor.html) при индексировании и добавил бы размер поля, как отдельное поле. А можно еще оставить в поле только первые 100000 символов, или не индексировать запись вообще.

---

<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: [August 26, 2020, 2:01pm UTC](https://discuss.elastic.co/t/topic/242934/5 "2020-08-26T14:01:15Z")

</div>

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