2009-07-29 5 views
17

CouchDBを使用してデータを保存し、RESTful APIコールを使用して必要なデータを取得します。私のデータベースは、「テスト」と呼ばれ、私の書類はすべて、類似した構造を有し、(hello_worldは、文書IDです)このような何かを見ている:私は行うことができるようにしたいのですがどのようなCouchDBでパラメータ化されたクエリを実行するにはどうすればいいですか?

"hello_world" : {"id":123, "tags":["hello", "world"], "text":"Hello World"} 
"foo_bar" :{"id":124, "tags":["foo", "bar"], "text":"Foo Bar"} 

は私のユーザーを持っているが、例えば、「こんにちは世界」という言葉を含むすべての文書を私に渡してください。私は見解を持って遊んでいましたが、それらの値の1つ以上をmap関数の「キー」の部分私にこのような何かをすることができます:。

http://localhost:5984/test/_design/search/_view/search_view?key=「ハロー」

しかし、これで私のユーザーにクエリ文字列を指定させることはできません。たとえば、「hello world」を検索した場合はどうなりますか?私は2つのクエリを実行する必要があります:1つは "こんにちは"と1つは "世界"次に、結果を結合するためにJavaScriptの束を書いて、重複を削除するなど(YUCK!)。私が本当に欲しいのは、このような何かをできるようにすることです。そして、

http://localhost:5984/test/_design/search/_view/search_view?term=「Hello World」の

すべて見つけるために機能を縮小/ビューマップでパラメータの「Hello World」を使用しますtags配列に "hello"と "world"の両方を含むドキュメント。 CouchDBでもこのようなことが可能ですか?私が考えていない見方の中でこれを達成する別の方法がありますか?

答えて

19

CouchDBビューでは、ファセット検索やフルテキスト検索、結果交差をサポートしていません。 couchdb-luceneプラグインを使用すると、これらのすべてを行うことができます。

http://github.com/rnewson/couchdb-lucene/tree/master

+0

例を手がけて説明しますか? –

+6

彼はプロジェクトの開発者の一人です。「あなたはできませんが、このプロジェクトはあなたに任せます。」それはかなり良い答えです。 – dnolen

2

あなたがキーとして文書ごとに文書のタグの冪の各セットを発する場合は技術的にはこれが可能です。キーセット要素を順序付けしなければならず、クエリも順序付けられたタグをクエリする必要があります。ドキュメント{"hello_world" : {"id":123, "tags":["hello", "world"], "text":"Hello World"}ため

function map(doc) { 
    function powerset(array) { ... } 

    powerset_of_tags = powerset(doc.tags) 
    for(i in powerset_of_tags) { 
    emit(powerset_of_tags[i], doc); 
    } 
} 

これが発するでしょう:

{ key: [], doc: ... } 
{ key: ['hello'], doc: ... } 
{ key: ['world'], doc: ... } 
{ key: ['hello', 'world'], doc: ... } 

これは私がこのかなりarkwardソリューション検討することも可能ではあるが。私はより多くのタグのためのビューのディスク使用量を想像したくありません。私は放出されたキーの数が2^nのように増加することを期待しています。

+2

これはお勧めしません。パフォーマンスが大幅に低下し、前述のとおり、インデックスのストレージが制御不能になります。 上記のcouchdb-luceneは、彼が望むことを行う正しい方法です。 –