我编写了一个基本的XQuery,它接受一个参数,对数据执行“contains”参数并返回相关的数据集。
let $search_term:= request:get-parameter("param1",0)
return
<root> {
for $node in doc('http://localhost:8080/data/doc.xml')/root/node
for $value in $node/element/value
where contains((upper-case($value)), (upper-case($search_term)))
order by $node/title
return $node
} <root>
我如何进行扩展以搜索多个参数。在我的Java应用程序中,用户在编辑框中输入搜索字符串。因此,搜索字符串可能包含许多单词。目前,此代码仅允许在搜索字符串上搜索整个短语。
是否可以将“param1”中的所有单词解析为XQuery中的字符串序列,然后对此序列执行contains-any-of。最后,在扩展中,我可以按匹配数量对结果进行排序。
感谢。
答案 0 :(得分:0)
您必须在java或Xquery中编写搜索解析器才能执行此操作。 如果它是像MarkLogic这样的Xquery数据库或者存在-db,你可以使用它们的搜索API和索引。
如果您想在单个节点文本上进行简单搜索,那么您可以将用户输入转换为REGEX并使用fn:matches。但要注意那种情况下的XQuery注入。
查看你的代码片段我想再提一个建议。请考虑尽可能多地使用Xpath,而不是使用性能消耗的循环。
答案 1 :(得分:0)
你当然可以做一些事情,比如替换
where contains((upper-case($value)), (upper-case($search_term)))
通过
where some $v in tokenize($value, '\s'), $k in tokenize($search_term, '\s')
satisfies upper-case($v) = upper-case($k)
然而,我担心结果可能会令习惯于谷歌等引擎的智能自由文本搜索的用户感到失望。不是建立自己粗略的自由文本搜索,而是使用能够正常工作的东西。