2

クライアントから投稿された最終的な改良を行っています。大文字と小文字を区別しないクエリを実行する必要があります。基本的に、この単純なプログラムがどのように機能するかを説明します。

まず、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で。

どんなアイデアや助けも歓迎します。

4

2 に答える 2

2

クライアントによって投稿された改良要求は、大文字と小文字を区別してはならないというものです。非常に直感的な方法は、次のような小文字の関数を使用してXQueryステートメントを変更することです。

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

ただし、問題が発生します。この変更されたクエリは、私のマシンをメモリオーバーフローに陥らせます。私の「media_data.xml」は非常に巨大で、何千万ものメディアノードが含まれているため、各エントリで小文字()関数が実行され、マシンがクラッシュすると思います。

そのような恐れは正当化されません。

XPathの適切な実装では、その機能に自動メモリを使用します。これは、特定の述語の評価に必要なメモリがlower-case()、述語の評価直後に解放される(ガベージコレクションのない言語で)か、参照されずにガベージコレクションの準備ができるようになることを意味します。

于 2011-01-02T16:24:47.060 に答える
0

テーブルインデックスはおそらく解決策ではありません。インデックスがない場合は速度が低下しますが、メモリオーバーフローはトリガーされません。

データベース内のタイトルを複製してすべて小文字(または大文字で変換されたことを明確にする)にコピーし、通常のタイトルを表示しながら代替タイトルをクエリするのが最善の策だと思います。

一部の処理を保存するために、クエリの前にケースカバーを行うことができ$productます。

URLにアンパサンドをドロップできます。すべてのWebサーバーが?&を正しく解析するかどうかはわかりません。

于 2011-01-02T10:08:38.313 に答える