Найти тот же текст во временном диапазоне - PullRequest
0 голосов
/ 12 июля 2020

Я храню статьи из блогов в ElasticSearch в следующем формате:

{
  blog_id: keyword,
  blog_article_id: keyword,
  timestamp: date,
  article_text: text
}

Предположим, я хочу найти все блоги со статьями, в которых X упоминается как минимум дважды за последние 30 дней. Есть ли простой запрос, чтобы найти все blog_ids, в которых есть статьи с одним и тем же словом, по крайней мере, n раз в пределах диапазона дат?

Это правильный способ смоделировать проблему или мне следует использовать вложенные объекты для упрощения запрос?

Можно ли превратить это в отчет в Кибане?

1 Ответ

1 голос
/ 12 июля 2020

Самый простой вопрос, который приходит на ум:

{
  "_source": "blog_id", 
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "article_text": "xyz"
          }
        },
        {
          "range": {
            "timestamp": {
              "gte": "now-30d"
            }
          }
        }
      ]
    }
  }
}

nested объекты, скорее всего, ничего не упростят - наоборот.

Можно ли превратить его в отчет Kibana?

Конечно. Просто примените фильтры либо в KQL (Kib. Query lang), либо с помощью раскрывающихся списков и выберите метрику c, которую вы хотите отслеживать (общее количество blog_id, частота таймсерий и т. Д. c.)

РЕДАКТИРОВАТЬ количество вхождений: я знаю 2 способа:

  1. есть API term_vector, который дает вам информацию о частоте слов , но это автономный API и не может использоваться во время запроса.

  2. Тогда есть подход на основе сценария , при котором вы просматриваете весь текст статьи, трактуйте это как ключевое слово с учетом регистра, и подсчитать количество подстрок, тем самым исключив статьи с недостаточной частотой слов. Обратите внимание, что вам не обязательно использовать function_score, как я, - подойдет простой script query. это может занять нетривиальное количество времени, если у вас есть нетривиальное количество документов.

В вашем случае это может выглядеть так:

{
  "query": {
    "bool": {
      "must": [
        {
          "script": {
            "script": {
              "source": """
                def word = 'xyz';
                def docval = doc['article_text.keyword'].value;
                String temp = docval.replace(word, "");
                def no_of_occurences = ((docval.length() - temp.length()) / word.length());
                return no_of_occurences >= 2;
              """
            }
          }
        }
      ]
    }
  }
}
...