我正在经历客户发布的最终改进,这需要我进行不区分大小写的查询。我将基本上介绍这个简单的程序是如何工作的。
首先,在我的 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 中。
欢迎任何想法或帮助。