如何在Ravendb中创建复合索引
本文关键字:创建 复合 索引 Ravendb | 更新日期: 2023-09-27 18:08:39
我有文档集合"Messages"在我的基地(RavenDB)文档定义,如:
class Message
{
string Content;
Tag[] Tags;
Location[] Locations;
string[] Actions;
bool IsActive;
}
标签类定义:
class Tag
{
string Value;
Translation[] Translations;
}
位置类:
class Location
{
string Code;
Translation[] Translations;
}
翻译类:
class Translation
{
string LanguageCode;
string Value;
}
所以,我想创建一个索引,允许我通过几个字段进行查询:
- 按消息全文搜索。
- 只有IsActive==true的消息
- 消息中包含我的操作的消息。行动
- 包含myValue和myLanguageCode标签的消息
- location包含一些myCode和myLanguageCode
我想查询同时满足所有条件
那么,我应该如何为RavenDB定义索引?
在对RavenDB自动动态索引进行了简短的研究之后,我创建了如下内容
new IndexDefinition
{
Map = @"
from doc in docs.Messages
where IsActive==true
from docActionsItem in (IEnumerable<dynamic>)doc.Actions
from docTagsItem in (IEnumerable<dynamic>)doc.Tags
from docTagsItemTranslationsItem in (IEnumerable<dynamic>)docTagsItem.Translations
from docLocationsItem in (IEnumerable<dynamic>)doc.Locations
from docLocationsItemTranslationsItem in (IEnumerable<dynamic>)docLocationsItem.Translations
select new {
TagsValue = docTagsItem.Value,
Content = doc.Content,
Actions=docActionsItem,
TagsTranslationsLanguageCode = docTagsItemTranslationsItem.LanguageCode,
TagsTranslationsValue = docTagsItemTranslationsItem.Value,
LocationsCode = docLocationsItem.Code,
LocationsTranslationsLanguageCode=docLocationsItemTranslationsItem.LanguageCode,
LocationsTranslationsValue=docLocationsItemTranslationsItem.Value
}",
Analyzers =
{
{"Content", typeof(StandardAnalyzer).FullName},
}
}
不需要预先定义索引来在RavenDB中执行查询。只要创建linq-query, RavenDB就会动态地为您创建索引,而不需要任何额外的成本。
你可能想要自己创建索引的唯一用例是,如果你想要指定不同的Lucene。NET分析器在字段Message.Content上执行所谓的"全文搜索"。但即使这样也应该很简单,只需为索引创建一个linq-query,并在启动时将其传递给RavenDB。如果你想知道如何做到这一点,我建议你看看Ayende RaccoonBlog样本或官方文档,它将很快更新(供参考-> ravendb/docs有新的文档)。