Вопрос по facet, elasticsearch – ElasticSearch - Статистический фасет по длине поля строки

4

Я хотел бы получить данные о строковом поле, такие как минимальная, максимальная и средняя длина (путем подсчета количества символов в строке). Моя проблема в том, чтоагрегирование может использоваться только для числовых полей. Кроме того, я попробовал это, используя простой статистический аспект,

 "query":{
      "match_all": {}
  }, 
 "facets":{
      "stat1":{
           "statistical":{
               "field":"title"}
               }
          } 

но я получаю ошибки шарда и исключение SearchPhaseExecutionException. При попытке с полем скрипта возвращается ошибка OutOfMemoryError:

  "query":{
       "match_all": {}
   }, 
  "script_fields":{
       "test1":{"script": "doc[\"title\"].value" }
   }

Можно ли получить такие данные о простом строковом поле "title", используя CURL? Спасибо!

да, вы можете запускать скрипты на своих поляхelasticsearch.org/guide/en/elasticsearch/reference/current/... phoet

Ваш Ответ

1   ответ
7

но я считаю, что это должно работать.

Сначала несколько полезных ссылок на документы:

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-facets-statistical-facet.html.

Для реализации статистического аспекта соответствующие значения поля загружаются в память из индекса. Это означает, что для каждого осколка должно быть достаточно памяти, чтобы содержать их. Поскольку по умолчанию динамически вводимые типы являются длинными и двойными, одним из способов уменьшить объем занимаемой памяти является явное задание типов для соответствующих полей: короткие, целые или плавающие, когда это возможно.

Я не совсем уверен, как установить тип поля скрипта на «короткий», что, вероятно, то, что вы хотите. уменьшить память. Это ДОЛЖНО быть возможно.

ТАКЖЕ:http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-script-fields.html

Важно понимать разницу между doc ['my_field']. Value и _source.my_field. Первое, использующее ключевое слово doc, приведет к тому, что термины для этого поля будут загружены в память (кэшированы), что приведет к более быстрому выполнению, но большему потреблению памяти. Кроме того, нотация doc [...] допускает только поля с простым значением (не может вернуть объект json из него) и имеет смысл только для не анализируемых или основанных на одном члене полей.

Так что АЛЬТЕРНАТИВА: будет использовать_source вместоdoc который не будет кэшировать длины.

дает:

    {
        "query" : {
            "match_all" : {}
        },
        "facets" : {
            "stat1" : {
                "statistical" : {
                    "script" : "doc['title'].value.length()
                    //"script" : "_source.title.length() //ALTERNATIVE which isn't cached
                }
            }
        }
    }
Еще один вопрос: как я могу отсортировать эти результаты, а не видеть только 10 лучших отображаемых результатов? На самом деле мне нужны статистические данные, такие как минимальная длина, максимальная длина и средняя длина. Crista23
Спасибо за ваш ответ и очень полезные идеи! Я пробовал обе версии, первая аварийно завершает работу с OutOfMemoryException, в то время как вторая альтернатива дает мне SearchPhraseExecutionException - PropertyAccessException - не может получить доступ к длине. Crista23
Дан, вы обновите ответ с помощью length (), это хорошо для людей, читающих этот вопрос / ответ. Jettro Coenradie
изменился наlength() согласно комментарию. Geert-Jan

Похожие вопросы