Сколько слов между фразами в тексте? - PullRequest
0 голосов
/ 05 декабря 2018

У меня вопрос, как считать слова между фразами в тексте?Например, у меня есть следующий текст:

Элон Маск - технологический предприниматель и инвестор.Он является основателем, генеральным директором и ведущим дизайнером SpaceX.Элон Маск заявил, что цели SpaceX, Tesla и SolarCity вращаются вокруг его видения изменить мир и человечество.

И я хочу посчитать, сколько слов находится между "Элон Маск" и "SpaceX "или между" SolarCity "и" Tesla ".Как я могу сделать это в Elastic search в рамках одного документа?

1 Ответ

0 голосов
/ 10 декабря 2018

Ниже приведено то, что я придумал.

Отображение

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

Я создал образец отображения, состоящий из одного мультиполя myfield, следующим образом:

{  
   "myfield":{  
      "type":"text",
      "fields":{  
         "keyword":{  
            "type":"keyword",
            "ignore_above":256
         }
      }
   }
}

Запрос

I 'Мы использовали Script Query и Sum Aggregation для подсчета слов между двумя фразами.

POST <your_index_name>/_search
{
  "query": {
    "term": {
      "_id": "1"
    }
  },
  "aggs": {
    "wordCount": {
      "sum": {
        "script": {
          "source": """
            String st = doc['myfield.keyword'].value.toString();
            if(st.contains(params.phrase_1) && st.contains(params.phrase_2)){
              int start = st.indexOf(params.phrase_1);
              int end = st.indexOf(params.phrase_2);

              //Substring would have list of words that includes phrase_1 till index of phrase_2
              String subString = st.substring(start,end);

              //Count tokens available in params.phrase_1
              StringTokenizer tokens_phrase_1 = new StringTokenizer(params.phrase_1);

              //Count total tokens available in substring
              StringTokenizer tokens = new StringTokenizer(subString);

              //Count = Count of Words - Count of words in phrase_1
              return tokens.countTokens()-tokens_phrase_1.countTokens();
            }else{
              //defensive logic
              return 0;
            }
          """,
          "params":{
            "phrase_1": "Elon Musk",
            "phrase_2": "SpaceX"

          }
        }
      }
    }
  }
}

Обратите внимание, что входы находятся в разделе params.Я добавил несколько комментариев в приведенный выше код, которые помогут понять, как я добавил логику вычисления слов.

Пожалуйста, проверьте это и дайте мне знать, если это поможет!

...