使用eXist-db进行不区分大小写的搜索

时间:2011-01-02 09:33:01

标签: java xml xpath xquery exist-db

我正在经历客户发布的最终细化,这需要我做一个不区分大小写的查询。我将基本了解这个简单程序的工作原理。

首先,在我的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中。

欢迎任何想法或帮助。

2 个答案:

答案 0 :(得分:2)

  

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

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

然而,问题来了:这个   修改后的查询将运行我的机器   进入内存溢出。既然我的   “media_data.xml”非常庞大   包含数以千万计的媒体   节点,我假设小写()   函数将在每个上运行   条目,从而导致机器   崩溃。

这种担心是不合理的。

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

答案 1 :(得分:0)

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

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

要保存一些处理,可以在查询之前进行$product的案例转换。

您可以将&符号放在网址中,我不确定所有网络服务器都能正确解析?&