2

RavenDbにいくつかのコマンドが保存されており、それらはすべてICommandを実装しています。最後に変更されたRaven-Entity-Nameのメタデータを検索できるようにしたい。私は現在、以下のように各コマンドでマルチマップを実行しています。

public class CommandAuditSearch_Index : AbstractMultiMapIndexCreationTask<CommandAuditSearch_Index.Results>
    {
        public class Results
        {
            public string CommandType { get; set; }
            public DateTime LastModified { get; set; }
        }

        public CommandAuditSearch_Index()
        {
            AddMap<NewEmployeeStartCommand>(employees => employees.Select(x => new
            {
                CommandType = MetadataFor(x).Value<string>("Raven-Entity-Name"),
                LastModified = MetadataFor(x).Value<DateTime>("Last-Modified")
            }));

            AddMap<EmployeeLeaverCommand>(employees => employees.Select(x => new
            {
                CommandType = MetadataFor(x).Value<string>("Raven-Entity-Name"),
                LastModified = MetadataFor(x).Value<DateTime>("Last-Modified")
            }));

            Index(results => results.CommandType, FieldIndexing.Analyzed);
        }
    }

私はこれを次のように照会します:

session.Query<CommandAuditSearch_Index.Results, CommandAuditSearch_Index>()
                              .Where(x => x.CommandType == commandType && x.LastModified >= DateTime.Today).OfType<ICommand>().ToList();

タグ(エンティティ名)と最終更新日を取得するためにRavenにすでに組み込まれているインデックスがあることは知っていますが、上記のインデックスが示すように、結果を取得する方法がわからないようです。

誰かが静的インデックスの正しい方向に私を向けることができますか?ICommandsのリストとして結果を与えるクエリを実行する必要があるコマンドごとに、上記のようなマルチマップを用意する必要はありませんか?

ありがとう

水田

4

1 に答える 1

9

いくつかのポイント:

  • Searchquery メソッドで全文検索を行う場合を除き、フィールドを分析済みとしてマークする必要はありません。だけを使用している場合はWhere、インデックス タームを分析するメリットはありません。

  • 結果でメタデータ値を探している場合は、 を使用してドキュメント データではなくメタデータから値を取得する必要がありますGetMetadataForここを参照してください

  • あなたが言ったように、あなたが必要とするもののインデックスはすでにあります。クエリを実行する最も簡単な方法は、LuceneQueryAPI を使用することです。

    var tag = documentStore.Conventions.GetTypeTagName(theCommand.GetType());
    
    var results = session.Advanced
                         .LuceneQuery<ICommand, RavenDocumentsByEntityName>()
                         .WhereEquals("Tag", tag)
                         .AndAlso()
                         .WhereGreaterThanOrEqual("LastModified", DateTime.Today
                                                              .ToUniversalTime())
                         .ToList();
    
    foreach (var result in results)
    {
        var md = session.Advanced.GetMetadataFor(result);
        var entityName = md.Value<string>("Raven-Entity-Name");
        var lastModified = md.Value<DateTime>("Last-Modified");
    
        // you can see all the metadata if you like
        Debug.WriteLine(md.ToString(Formatting.Indented));
    }
    
于 2013-03-13T13:59:44.983 に答える