我有一个问题,如何计算文本中短语之间的单词?例如,我有下一个文本:
Elon Musk是一位技术企业家和投资者。他是SpaceX的创始人,首席执行官和首席设计师。马斯克(Elon Musk)表示,SpaceX,特斯拉(Tesla)和SolarCity的目标围绕着他改变世界和人类的愿景。
我想计算“ Elon Mask”和“ SpaceX”之间或“ SolarCity”和“ Tesla”之间有多少个单词。如何在一个文档的框架中进行弹性搜索?
答案 0 :(得分:0)
下面是我的想法。
映射
您需要确保该字段的类型为keyword
,并且需要使用通过该文档的id
字段进行的字词查询,因此以下逻辑仅适用于该文件。
我创建了一个由单个多字段myfield
组成的示例映射,如下所示:
{
"myfield":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
}
}
查询
我已经使用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
部分中。我在上面的代码中添加了一些注释,这些注释有助于理解如何添加计算字词的逻辑。
请测试一下,让我知道是否有帮助!