Как я могу получить вхождения и doc_count каждого термина индекса ES? - PullRequest
0 голосов
/ 22 мая 2019

У меня есть индекс ES вида

{
  "adminfile" : {
    "mappings" : {
      "properties" : {
        "text" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "title" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
  }
}

Поле 'title' является заголовком строки, найденной в поле 'text'. Заголовки не содержат пробелов, а тексты являются обычными текстами (предложения с пробелами, точками и т. Д.).

Я хочу получить все термины в индексе и их doc_count и / или периодичность. Я нашел этот запрос в документе ES: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html

GET /adminfile/_search
{
    "size": 10,
    "aggs" : {
        "text" : {
            "terms" : {
                "field" : "text.keyword",
                "order" : { "_count" : "asc" },
                "size": 10
            }
        }
    }
}

Возвращает все источники, но области агрегации пусты. Если в этой команде я заменю «text.keyword» на «title.keyword», она сработает и вернет все заголовки в качестве ключей.

Почему это не работает с текстовыми полями?

Есть ли лучшая команда для использования? Я знаю, что это:

GET /adminfile/_search
{
    "query" : {
        "match" : {"text" : "WordToSearch"}
    },
    "_source":false,
    "aggregations": {
        "keywords" : {
            "significant_text" : {
                "field" : "text",
                "filter_duplicate_text": true,
                "size": 100
            }
        }
    },
    "highlight": {
        "fields": {
            "text": {}
        }
    }
}

работает, чтобы получить все вхождения wordToSearch в каждом документе индекса, с количеством и частотой. Есть ли способ попросить эту команду соответствовать каждому слову каждого документа?

РЕДАКТИРОВАТЬ: Я также попытался изменить имя текстового поля на «contenu» на случай, если ES не понравилось поле имени «текст» и типа «текст». Нет эффекта.

Другим вариантом может быть использование https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-termvectors.html, но _termvectors работает только для одного определенного идентификатора (или _mtermvectors для идентификатора, определенного для нескольких элементов, но не для всех документов в любом случае)

EDIT2: я понял, что ignore_above может быть проблемой. Я попытался сократить все свои тексты до 200 символов в качестве теста. Теперь запрос выполняется, за исключением того, что он возвращает весь текст в виде ключа, а не разрезает его на слова.

1 Ответ

0 голосов
/ 22 мая 2019

Когда вы используете версию поля keyword, содержимое сохраняется как один большой токен. Вы правы, предполагая, что ignore_above является источником вашей проблемы, поскольку эти токены, очевидно, будут длиннее 256 символов в вашем наборе данных.

Если вы вместо этого агрегируете по токенизированному полю (обычному текстовому полю), вместо версии keyword вы получите счетчики для каждого слова (то есть для каждого токена), обработанного полем.

...