Ниже приведено то, что я придумал.
Отображение
Вам необходимо убедиться, что поле имеет тип 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
.Я добавил несколько комментариев в приведенный выше код, которые помогут понять, как я добавил логику вычисления слов.
Пожалуйста, проверьте это и дайте мне знать, если это поможет!