ElasticSearch: фильтрация документов на основе длины поля?

Есть ли способ фильтровать документы ElasticSearch на основе длины определенного поля?

Например, у меня есть куча документов с полем "тело", и я хочу только вернуть результаты, в которых число символов в теле равно > 1000. Есть ли способ сделать это в ES без необходимости добавлять дополнительный столбец с длиной в индексе?

Ответ 2

Вы также можете создать собственный токенизатор и использовать его в свойстве multifields следующим образом:

PUT test_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "character_analyzer": {
          "type": "custom",
          "tokenizer": "character_tokenizer"
        }
      },
      "tokenizer": {
        "character_tokenizer": {
          "type": "nGram",
          "min_gram": 1,
          "max_gram": 1
        }
      }
    }
  }, 
  "mappings": {
    "person": {
      "properties": {
        "name": { 
          "type": "text",
          "fields": {
            "keyword": { 
              "type": "keyword"
            },
            "words_count": { 
              "type": "token_count",
              "analyzer": "standard"
            },
            "length": { 
              "type": "token_count",
              "analyzer": "character_analyzer"
            }
          }
        }
      }
    }
  }
}

PUT test_index/person/1
{
  "name": "John Smith"
}

PUT test_index/person/2
{
  "name": "Rachel Alice Williams"
}

GET test_index/person/_search
{
  "query": {
    "term": {
      "name.length": 10
    }
  }
}