我有一个问题,课文中短语之间的单词是如何计数的?例如,我有下一个文本:
埃隆·马斯克( Elon )是一位科技企业家和投资者。他是SpaceX的创始人、首席执行官和首席设计师。埃隆·马斯克( Elon )表示,SpaceX、Tesla和SolarCity的目标围绕着他改变世界和人类的愿景。
我想数一数"Elon“和"SpaceX”或"SolarCity“和"Tesla”之间有多少单词。如何在一个文档的框架内进行弹性搜索?
发布于 2018-12-09 21:42:00
下面是我想出的。
映射
您需要确保该字段的类型为keyword,并且您将使用使用该文档的id字段的术语查询,以便只对该文档应用以下逻辑。
我创建了一个由单个多字段myfield组成的示例映射,如下所示:
{
"myfield":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
}
}查询
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部分。我在上面的代码中添加了一些注释,这将有助于理解我是如何添加计算单词的逻辑的。
请测试这个,如果这有帮助,请告诉我!
https://stackoverflow.com/questions/53632934
复制相似问题