【问题标题】:How to create a composite index in Ravendb如何在 Ravendb 中创建复合索引
【发布时间】:2011-09-13 11:18:17
【问题描述】:

我的基地 (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. Message.Content 全文搜索
  2. 仅带有 IsActive==true 的消息
  3. Message.Actions 中包含我的操作的消息
  4. 包含带有 myValue 和 myLanguageCode 标记的消息
  5. 位置包含带有一些 myCode 和 myLanguageCode 的位置

我想同时查询所有条件

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

【问题讨论】:

    标签: c# indexing ravendb


    【解决方案1】:

    好吧,在对 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},                                    
            }
    }
    

    【讨论】:

      【解决方案2】:

      无需预先定义索引即可在 RavenDB 中进行查询。只需创建 linq-query - RavenDB 就会为您动态创建索引,无需任何额外费用。

      您可能希望自己创建索引的唯一用例是,如果您想指定一个不同的 Lucene.NET 分析器来执行您在 Message.Content 字段上所谓的“全文搜索” .但即使这样也应该像为索引创建 linq-query 并在启动时将其传递到 RavenDB 一样简单。如果您想知道如何操作,我建议您查看 Ayende RaccoonBlog 示例或官方文档,它们将很快更新(仅供参考 -> ravendb/docs 有新文档)。

      【讨论】:

      • 好的。但我无法想象这样的 linq 查询。无论如何,我想了解如何创建这样的索引
      • 是的,这就是文档的用途。请查看它或标记为“乌鸦”的 Ayende 帖子。我相信你会找到这些链接。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-01
      • 1970-01-01
      相关资源
      最近更新 更多