如何手动解析OpenSearch的query子句?

Answer_li 2021-01-13 02:45:41
"query": "( default:'测试' OR author:'测试' OR tag_names:'测试' ) AND final_status:'3'

通过String类型的query如何获取到字符串中default,author,tag_names,final_status的值

...全文
1631 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
顾染尘 2021-01-18
  • 打赏
  • 举报
回复
每个结果都是用单引号分隔的这个不会变吧,这个问题有解决吗?可以把思路结果写一下提供一下学习资源吗?
Answer_li 2021-01-18
  • 打赏
  • 举报
回复
引用 5 楼 太菜了12138 的回复:
这完全可以转成map,不就可以了
最后还是通过map来传参了
Answer_li 2021-01-18
  • 打赏
  • 举报
回复
引用 3 楼 顾染尘 的回复:
所有输出
String info = "\"query\": \"( default:'测试' OR author:'测试' OR tag_names:'测试' ) AND final_status:'3'";
	     String[] s1=info.split("'");
	     for(int i=0;i<s1.length;i++){
	        //循环输出结果
	         System.out.println(s1[i]);

	     }
结果
"query": "( default:   //这行代表的是0
测试//这行代表的是1
 OR author://这行代表的是2
测试//这行代表的是3
 OR tag_names://这行代表的是4
测试//这行代表的是5
 ) AND final_status://这行代表的是6
3//这行代表的是7
然后你想获取什么值就把i换成对应的数,这个样子
用符号分割字符串不可行,因为“测试”这个东西是用户输入的不能保证他输入什么,不过还是谢谢啦
Answer_li 2021-01-18
  • 打赏
  • 举报
回复
引用 8 楼 顾染尘 的回复:
每个结果都是用单引号分隔的这个不会变吧,这个问题有解决吗?可以把思路结果写一下提供一下学习资源吗?
因为这个场景下单引号里面的内容有可能也会包含单引号,最后把这个query的格式换成map了
我只爱钱 2021-01-15
  • 打赏
  • 举报
回复
这完全可以转成map,不就可以了
Ja先生 2021-01-15
  • 打赏
  • 举报
回复
String s = str.split("\\(")[1]; String s1 = s.split("\\)")[0]; String[] res = s1.split("OR"); String res2 = str.split("AND")[1]; Set<String> set = CollectionUtils.toSet(res); set.add(res2); List<String> strings = set.stream().map(ss -> { String trim = ss.trim(); trim = trim.startsWith("default:") ? trim.substring(8, trim.length()):trim ; trim = trim.startsWith("author:") ? trim.substring(7, trim.length()):trim; trim = trim.startsWith("tag_names:") ? trim.substring(10, trim.length()):trim; trim = trim.startsWith("final_status:") ? trim.substring(13, trim.length()):trim; return trim; }).collect(Collectors.toList());
顾染尘 2021-01-15
  • 打赏
  • 举报
回复
所有输出
String info = "\"query\": \"( default:'测试' OR author:'测试' OR tag_names:'测试' ) AND final_status:'3'";
	     String[] s1=info.split("'");
	     for(int i=0;i<s1.length;i++){
	        //循环输出结果
	         System.out.println(s1[i]);

	     }
结果
"query": "( default:   //这行代表的是0
测试//这行代表的是1
 OR author://这行代表的是2
测试//这行代表的是3
 OR tag_names://这行代表的是4
测试//这行代表的是5
 ) AND final_status://这行代表的是6
3//这行代表的是7
然后你想获取什么值就把i换成对应的数,这个样子
Answer_li 2021-01-15
  • 打赏
  • 举报
回复
引用 1 楼 顾染尘 的回复:
根据结果使用正则可以吗?
测试这个参数值有可能和这个个字符串中任何一段字符相等,所以我觉得正则不行,你能写出正则吗看一下吗
顾染尘 2021-01-14
  • 打赏
  • 举报
回复
根据结果使用正则可以吗?

50,503

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧