Java 使用existdb进行不区分大小写的搜索

Java 使用existdb进行不区分大小写的搜索,java,xml,xpath,xquery,exist-db,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课程中,我做了一个相当简单的网页解析:

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语句中的小写函数修改XQuery语句,如:

$query := $mediaNodes//media[contains(lower-case(title/text(),lower-case($title))],
然而,问题来了:这个修改过的查询将使我的机器内存溢出。由于我的“media_data.xml”非常庞大,包含数以百万计的媒体节点, 我假设lower-case()函数将在每个条目上运行,从而导致机器崩溃

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


欢迎任何想法或帮助。

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

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

要将一些处理保存到,您可以在查询之前执行
$product
的案例转换

您可以在您的URL中添加符号,我不确定所有Web服务器是否正确解析?&

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

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

这种担心是没有道理的。


任何健全的XPath实现都会为其函数使用自动内存。这意味着计算特定谓词所需的内存,包括
lower-case(),我没有使用XQuery的经验,但这看起来不像是Java部分可以解决的问题。XQuery显然没有containsIgnoreCase方法?那会派上用场的。好问题,+1。请参阅我的答案,以了解您的担忧不合理的原因。:)你测试过了吗?为什么带有
fn:contains
的谓词不会使带有
fn:lower case
的相同谓词崩溃,因为
fn:contains
的参数会崩溃?应该慢一点,是的。这就是为什么a会从表达式中去掉常量
小写($title)
。但无论如何,一个真正智能的XQuery引擎可以为您做到这一点。
$query := $mediaNodes//media
            [contains(lower-case(title/text(),lower-case($title))],