2

我正在经历客户发布的最终改进,这需要我进行不区分大小写的查询。我将基本上介绍这个简单的程序是如何工作的。

首先,在我的 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”,它将返回标题可能是“Chicago”或“Chicken”的媒体节点。

客户发布的细化请求是不应该区分大小写。非常直观的方法是通过在其中使用小写函数来修改 XQuery 语句,例如:

$query := $mediaNodes//media[contains(lower-case(title/text(),lower-case($title))],

但是,问题来了:这个修改后的查询会使我的机器内存溢出。由于我的“media_data.xml”非常庞大并且包含数以百万计的媒体节点,我假设 lower-case() 函数将在每个条目上运行,从而导致机器崩溃。

我与一些有经验的 XQuery 程序员交谈过,他们认为我应该使用索引来解决这个问题,我一定会对此进行研究。但在此之前,我只是在这里发布这个问题以获得其他想法或任何建议,您认为任何其他方式可能会有所帮助吗?例如,我可以调整 Java 解析语句以实现不区分大小写吗?因为我想我看到有些人使用“包含”进行了一些字符串连接。在将其传递给服务器之前在 Java 中。

欢迎任何想法或帮助。

4

2 回答 2

2

客户发布的细化请求是不应该区分大小写。非常直观的方法是通过在其中使用小写函数来修改 XQuery 语句,例如:

$query := $mediaNodes//media
            [contains(lower-case(title/text(),lower-case($title))], 

但是,问题来了:这个修改后的查询会使我的机器内存溢出。由于我的“media_data.xml”非常庞大并且包含数以百万计的媒体节点,我假设 lower-case() 函数将在每个条目上运行,从而导致机器崩溃。

这种担心是没有道理的。

任何合理的 XPath 实现都为其功能使用自动内存。这意味着评估特定谓词所需的内存(包括结果lower-case())在谓词评估后立即被释放(在没有垃圾收集的语言中)或未被引用并准备好进行垃圾收集。

于 2011-01-02T16:24:47.060 回答
0

表索引可能不是解决方案,因为索引的absebse 会减慢速度,但不会触发内存溢出。

我认为您最好的选择是复制数据库中的标题,将其复制为全小写(或大写更清楚地表明它已被转换)并在显示正常标题时查询备用标题。

$product为了节省一些处理,您可以在查询之前进行案例覆盖。

您可以在 URL 中删除与号,我不确定所有网络服务器都正确解析?&

于 2011-01-02T10:08:38.313 回答