クライアントから投稿された最終的な改良を行っています。大文字と小文字を区別しないクエリを実行する必要があります。基本的に、この単純なプログラムがどのように機能するかを説明します。
まず、Javaクラスで、かなり単純なWebページの解析を行いました。
title=(String)results.get("title");
doc = docBuilder.parse("http://" + server + ":" + port + "/exist/rest/db/wb/xql/media_lookup.xql?" + "&title=" + title);
このJavaステートメントは、ローカルホストに保存されている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」は非常に巨大で、何千万ものメディアノードが含まれているため、各エントリで小文字()関数が実行され、マシンがクラッシュすると思います。
私は経験豊富なXQueryプログラマーと話をしましたが、彼らは私がこの問題を解決するためにインデックスを使用する必要があると考えています。私は間違いなくそれを調査します。しかしその前に、私はこの問題をここに投稿して、他のアイデアや提案を得ています。他の方法が役立つと思いますか?たとえば、Javaの解析ステートメントを微調整して、大文字と小文字を区別しないようにすることはできますか?「contains」を使って文字列を連結する人もいると思います。サーバーに渡す前にJavaで。
どんなアイデアや助けも歓迎します。