3

BaseX に巨大な XML ファイルが保存されています。以下は、XML ノードの構造です。

Datas   (Parent Node)
  - Data  (Child of above)
     - Desc  (Child of above)
        - P    (Child of above) and contains the actual text 

Pタグにはすべてのテキストが含まれており、Pタグ内にある特定の単語の出現回数をカウントする必要があります。

フルテキスト インデックスを作成しました。特定の単語の出現をカウントするために、次の2つのクエリを使用しています

ft:count(doc('BHCR')/Datas/Data/Desc[. contains text 'revolution'])

このクエリは 2177 を返し、25 秒かかりました。

もう一つ

ft:count(doc('BHCR')/Datas/Data/Desc[text() contains text 'revolution'])

このクエリは 3684 を返し、52 ミリ秒かかりました。

どちらが正しいですか?これら2つのクエリの違いを説明できる人はいますか?

4

1 に答える 1

3

最初のクエリでは、コンテキスト アイテム.によって要素のすべてのテキスト ノードがマージされ (つまり、その文字列値が作成され)、フルテキスト トークンを検索するために使用されます。このマージにより、新しいキーワードが作成される可能性があります。例として、次のクエリは true を返します...

<xml><b>H</b>i</xml>/. contains text 'hi'

..where as 次のクエリは true を返します...

<xml><b>H</b>i</xml> contains text 'hi'

新しいキーワードはフルテキスト インデックスに格納できないため、インデックスへのアクセスは行われず、クエリにかかる時間が大幅に長くなります。

2 番目のクエリは、子テキスト ノードにあるすべてのDesc要素を返します。revolution要素のすべての降順テキストを解析する場合はDesc、次のクエリで期待どおりの結果が得られます。

ft:count(doc('BHCR')/Datas/Data/Desc[.//text() contains text 'revolution']

詳細については、BaseX ドキュメントの全文: 混合コンテキストセクションを参照してください。

これが役に立てば幸いです、クリスチャン

于 2012-08-03T08:07:22.313 に答える