1

私はドキュメントを保存しています-そして各ドキュメントにはこのような「ラベル」のコレクションがあります。ラベルはユーザー定義であり、任意のプレーンテキストにすることができます。

{
  "FeedOwner": "4ca44f7d-b3e0-4831-b0c7-59fd9e5bd30d",
  "MessageBody": "blablabla",
  "Labels": [
    {
      "IsUser": false,
      "Text": "Mine"
    },
    {
      "IsUser": false,
      "Text": "Incomplete"
    }
  ],
  "CreationDate": "2012-04-30T15:35:20.8588704"
}

ユーザーがラベルの任意の組み合わせを照会できるようにする必要があります。

"Mine" OR "Incomplete"
"Incomplete" only
or
"Mine" AND NOT "Incomplete"

これにより、次のようなRavenクエリが発生します。

Query: (FeedOwner:25eb541c\-b04a\-4f08\-b468\-65714f259ac2) AND (Labels,
Text:Mine) AND (Labels,Text:Incomplete)

私は、レイヴンがこれまでに見たことのないクエリに対して「動的インデックス」を生成することを理解しています。これでわかるように、これにより多くのインデックスが作成される可能性があります。

Ravenでこの機能を実現するための最良のアプローチは何でしょうか?

[編集]

これは私のLinqですが、Ravenから「すべてがサポートされていません」というエラーが表示されます。

var result = from candidateAnnouncement in session.Query<FeedAnnouncement>()
where listOfRequiredLabels.All(
    requiredLabel => candidateAnnouncement.Labels.Any(
        candidateLabel => candidateLabel.Text == requiredLabel))
select candidateAnnouncement;

[編集]

私は同様の質問をしました、そしてそれに対する答えは両方の質問を解決しました:レイヴンクエリはコレクションに0の結果を返します

4

1 に答える 1

0

FeedOwnerドキュメントの固有のプロパティである場合、クエリはまったく意味をなさないことに注意してください。その場合、オブジェクトへの標準的な linq を使用してクライアントで実行する必要があります。

さて、それFeedOwnerがユニークなものではないことを考えると、あなたのクエリは基本的に正しいです. ただし、実際に何を返したいかによっては、代わりに静的インデックスを作成する必要がある場合があります。

動的に生成されたインデックスを使用している場合、常にドキュメントが戻り値として取得され、クエリに一致した特定のラベルを取得することはできません。これで問題ない場合は、そのアプローチを使用して、クエリオプティマイザーにその仕事をさせてください (実際に多くのドキュメントが事前にインデックスを構築している場合のみ)。

クエリ結果として実際のラベルを使用する場合は、クエリを実行するフィールドをカバーする単純なマップ インデックスを前もって作成する必要があります。サンプルでは、​​これはすべてのラベルの FeedOwner と Text になります。クエリから返すフィールドで FieldStorage.Yes を使用する必要があるため、ラベルの Text プロパティで有効にします。ただし、FeedOwner プロパティを使用する必要はありません。これは、raven がクエリ結果の一部として提供する実際のドキュメントの一部であるためです。ravens のドキュメントを参照して、静的インデックスを構築し、フィールド ストレージを使用する方法を確認してください。

于 2012-04-30T07:32:42.660 に答える