Фильтр запросов Elasticsearch для подсчета слов

В настоящее время я ищу способ вернуть документы с максимальным количеством n слов в определенном поле.

Запрос может выглядеть так для результирующего набора, который содержит документы с менее чем тремя словами в поле «имя», но, насколько мне известно, нет ничего похожего на word_count.

Кто-нибудь знает, как с этим справиться, может быть, даже по-другому?

GET myindex/myobject/_search
{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {
              "word_count": {
                "name": {
                  "lte": 3
                }
              }
            }
          ]
        }
      },
      "query": {
        "match_all" : { }
      }
    }
  }
}

person Jesse    schedule 05.08.2016    source источник


Ответы (1)


Вы можете использовать тип данных token_count, чтобы индексировать количество токенов в заданном поле, а затем выполнять поиск в этом поле.

# 1. create the index/mapping with a token_count field
PUT myindex
{
  "mappings": {
    "myobject": {
      "properties": {
        "name": { 
          "type": "string",
          "fields": {
            "word_count": { 
              "type":     "token_count",
              "analyzer": "standard"
            }
          }
        }
      }
    }
  }
}

# 2. index some documents

PUT index/myobject/1
{
   "name": "The quick brown fox"
}
PUT index/myobject/2
{
   "name": "brown fox"
}

# 3. the following query will only return document 2
POST myindex/_search
{
  "query": {
    "range": {
      "name.word_count": { 
        "lt": 3  
      }
    }
  }
}
person Val    schedule 05.08.2016
comment
Это звучит как возможное решение. Вероятно, мне придется переиндексировать все документы, но для меня это нормально. Спасибо за помощь. - person Jesse; 05.08.2016
comment
Да, вам нужно создать новый индекс и переиндексировать данные, чтобы заполнить поле name.word_count. - person Val; 05.08.2016