各 RavenDB サーバー インスタンスがクエリを高速化するために使用するインデックスは、フルテキスト検索エンジンであるLuceneを利用しています。
Lucene は Document を取得し、それを Fields に分割し、次に、Tokenization と呼ばれるプロセスで Field 内のすべてのテキストをトークン (Terms) に分割します。これらのトークンは、インデックスに格納され、後で検索されるものです。
{...}
トークン化と分析のプロセスが完了すると、結果のトークンがインデックスに格納され、検索の準備が整います。
{...}
各フィールドのデフォルト値は、ストアでは FieldStorage.No、インデックスでは FieldIndexing.Default です。
FieldIndexing.No を設定すると、クエリ時に where 句で値を使用できなくなります (元のプロジェクションに存在しないのと同様)。FieldIndexing.NotAnalyzed により、プロパティ全体が単一のトークンとして扱われ、このフィールドで KeywordAnalyzer を使用する場合と同様に、一致は正確でなければなりません。後者は、たとえば製品 ID に役立ちます。FieldIndexing.Analyzed を使用すると、フィールドに対して全文検索操作を実行できます。FieldIndexing.Default は、フィールドを小文字の単一の用語としてインデックス付けします。
私が理解しているように、RavenDB インデックスを作成するにはMap
、次のようにプロパティを指定するだけです。
public class PlayersIndex : AbstractIndexCreationTask<Player>
{
public PlayersIndex()
{
Map = players => from doc in players
select new { doc.PlayerId, doc.TeamId, doc.PositionId };
}
}
これが私の質問です:
、 、、であるPlayerId
と仮定した場合、次のことを行う必要があります。Guid
TeamId
int
PositionId
enum
- インデックス作成オプションの指定を控えますか?
- 各フィールドを
FieldIndexing.NotAnalyzed
?
つまり、次のようにフィールドを指定するという考えを受け入れる必要がありますか?
public class PlayersIndex : AbstractIndexCreationTask<Player>
{
public PlayersIndex()
{
Map = players => from doc in players
select new { doc.PlayerId, doc.TeamId, doc.PositionId };
Indexes.Add(x => x.PlayerId, FieldIndexing.NotAnalyzed);
Indexes.Add(x => x.TeamId, FieldIndexing.NotAnalyzed);
Indexes.Add(x => x.PositionId, FieldIndexing.NotAnalyzed);
}
}