我正在经历客户发布的最终细化,这需要我做一个不区分大小写的查询。我将基本了解这个简单程序的工作原理。
首先,在我的Java类中,我做了一个相当简单的网页解析:
title=(String)results.get("title");
doc = docBuilder.parse("http://" + server + ":" + port + "/exist/rest/db/wb/xql/media_lookup.xql?" + "&title=" + title);
此Java语句引用存储在localhost上的XQuery文件“media_lookup.xql”,我们传递的唯一参数是字符串“title”。
其次,我们来看看那个XQuery文件:
$title := request:get-parameter('title',""),
$mediaNodes := doc('/db/wb/portfolio/media_data.xml'),
$query := $mediaNodes//media[contains(title,$title)],
然后它将评估该查询。这个XQuery将获取从我们的Java类传递的“title”参数,并查询存储在数据库中的“media_data”xml文件,该文件包含一堆带有“title”元素节点的媒体节点。正如您所料,这个简单的查询将匹配那些'title'元素包含字符串'title'的值的子字符串的媒体节点。因此,如果我们的“标题”是“Chi”,它将返回标题可能是“芝加哥”或“鸡”的媒体节点。
客户发布的细化请求是不应区分大小写。非常直观的方法是通过在其中使用小写函数来修改XQuery语句,例如:
$query := $mediaNodes//media[contains(lower-case(title/text(),lower-case($title))],
然而,问题来了:这个修改过的查询会使我的机器进入内存溢出。由于我的“media_data.xml”非常庞大并且包含数百万个媒体节点的数量, 我假设小写()函数将在每个条目上运行,从而导致机器崩溃。
我和一些经验丰富的XQuery程序员谈过,他们认为我应该用一个索引来解决这个问题,我一定会研究它。但在此之前,我只是在这里发布此问题以获得其他想法或任何建议,您认为任何其他方式可能会有所帮助吗?例如,我可以调整Java解析语句以实现不区分大小写吗?因为我认为我看到有些人使用“包含”进行了一些字符串连接。在将Java传递给服务器之前在Java中。
欢迎任何想法或帮助。
答案 0 :(得分:2)
由...发布的细化请求 客户是应该没有 区分大小写。非常直观 方法是修改XQuery语句 通过在其中使用小写函数, 像:
$query := $mediaNodes//media
[contains(lower-case(title/text(),lower-case($title))],
然而,问题来了:这个 修改后的查询将运行我的机器 进入内存溢出。既然我的 “media_data.xml”非常庞大 包含数以千万计的媒体 节点,我假设小写() 函数将在每个上运行 条目,从而导致机器 崩溃。
这种担心是不合理的。
任何理智的XPath实现都使用自动内存来实现其功能。这意味着在评估谓词之后,评估特定谓词所需的内存(包括lower-case()
的结果)将被释放(在没有垃圾收集的语言中)或未引用并准备好进行垃圾收集。
答案 1 :(得分:0)
表索引可能不是解决方案,因为索引的absebse会降低速度,但不会触发内存溢出。
我认为你最好的选择是复制数据库中的标题,将其复制为全小写(或大写,更清楚地表明它已被转换),并在呈现正常标题时查询备用标题。
要保存一些处理,可以在查询之前进行$product
的案例转换。
您可以将&符号放在网址中,我不确定所有网络服务器都能正确解析?& 。