ElasticSearch: фильтрация документов на основе длины поля?
Есть ли способ фильтровать документы ElasticSearch на основе длины определенного поля?
Например, у меня есть куча документов с полем "тело", и я хочу только вернуть результаты, в которых число символов в теле равно > 1000. Есть ли способ сделать это в ES без необходимости добавлять дополнительный столбец с длиной в индексе?
Ответы
Ответ 1
Используйте фильтр script, например:
"filtered" : {
"query" : {
...
},
"filter" : {
"script" : {
"script" : "doc['body'].length > 1000"
}
}
}
ИЗМЕНИТЬ
К сожалению, для ссылки запроса DSL-руководства в фильтрах script
Ответ 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
}
}
}