UCM中GET_SEARCH_RESULTS请求QueryText无效问题排查
解决Oracle UCM GET_SEARCH_RESULTS服务QueryText无效问题
我来帮你拆解这个问题——你遇到的核心问题确实和XML转义处理、Oracle UCM的查询语法规范这两点有关,下面详细分析:
问题原因
XML转义导致服务端解析错误
你在SOAP请求里把<转成了<,但UCM的GET_SEARCH_RESULTS服务接收QueryText时,需要的是原始的查询操作符逻辑,而不是转义后的实体字符串。当SOAP信封传输到服务端后,转义后的<contains>会被解析成字符串字面量,而不是UCM能识别的包含匹配操作符,所以直接被判定为无效查询。混淆了UCM不同搜索接口的语法
你用的<contains>是类似UCM UI查询或者部分REST接口的写法,但针对database类型的搜索引擎,GET_SEARCH_RESULTS服务要求使用SQL风格的CONTAINS关键字语法,而不是XML标签式的<contains>。这也是为什么你只写dDocTitle能正常返回所有文档——此时服务端默认执行了全量查询,没有语法错误。
解决方案
方案1:使用数据库搜索引擎支持的标准语法(推荐)
直接修改QueryText为SQL风格的包含匹配写法,不需要转义特殊字符,因为这里不需要XML标签,语法本身符合XML文本要求:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ucm="http://www.oracle.com/UCM"> <soapenv:Header/> <soapenv:Body> <ucm:GenericRequest webKey="cs"> <ucm:Service IdcService="GET_SEARCH_RESULTS"> <ucm:Document> <ucm:Field name="SearchEngineName">database</ucm:Field> <ucm:Field name="QueryText">dDocTitle CONTAINS 'Test'</ucm:Field> </ucm:Document> </ucm:Service> </ucm:GenericRequest> </soapenv:Body> </soapenv:Envelope>
方案2:若需使用<contains>操作符(针对非数据库搜索引擎)
如果你的UCM配置了其他搜索引擎(比如Oracle Text),需要使用<contains>标签的话,要确保XML转义正确,同时服务端能识别该语法。此时你需要把整个QueryText用CDATA包裹,避免XML解析错误:
<ucm:Field name="QueryText"> <![CDATA[dDocTitle <contains> 'Test']]> </ucm:Field>
不过注意,这种写法仅适用于支持该语法的搜索引擎,database引擎不推荐使用。
验证步骤
- 替换QueryText后重新发送SOAP请求。
- 检查响应中的
StatusCode是否为0(成功状态),同时查看返回的文档列表是否正确过滤出标题包含Test的内容。 - 如果仍有问题,可在UCM控制台开启DEBUG级别的日志,查看服务端实际接收到的QueryText参数,确认是否和预期一致。
内容的提问来源于stack exchange,提问作者S.S.Praneeth
相关产品推荐
相关产品推荐

