来自RavenDB 的文档:
每个 RavenDB 服务器实例用于促进快速查询的索引由全文搜索引擎Lucene提供支持。
Lucene 获取一个 Document,将其分解为 Fields,然后在称为 Tokenization 的过程中将 Field 中的所有文本拆分为标记(Terms)。这些标记将存储在索引中,稍后将对其进行搜索。
{...}
标记化和分析过程完成后,生成的标记存储在索引中,现在可以使用该索引进行搜索。
{...}
每个字段的默认值是 Stores 中的 FieldStorage.No 和 Indexes 中的 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);
}
}