如何在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;
}

所以,我想创建一个索引,允许我通过几个字段进行查询:

  1. 按消息全文搜索。
  2. 只有IsActive==true的消息
  3. 消息中包含我的操作的消息。行动
  4. 包含myValue和myLanguageCode标签的消息
  5. location包含一些myCode和myLanguageCode

我想查询同时满足所有条件

那么,我应该如何为RavenDB定义索引?

如何在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有新的文档)。