Как создать составной индекс в Ravendb - PullRequest
2 голосов
/ 13 сентября 2011

У меня есть коллекция документов "Сообщения" в моей базе (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. Полнотекстовый поиск по сообщению.Content
  2. Только сообщения с IsActive == true
  3. Сообщения, содержащие мое действие в Message.Actions
  4. Сообщения, содержащие тег с myValue и myLanguageCode
  5. Локации, содержащие местоположение с некоторыми myCode и myLanguageCode

Я хотел бы запросить выполнение всех условий одновременно

Итак, как мне определить индекс для RavenDB?

Ответы [ 2 ]

2 голосов
/ 14 сентября 2011

Что ж, после краткого изучения автодинамических индексов 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},                                    
        }
}
1 голос
/ 14 сентября 2011

Нет необходимости предварительно задавать индекс для выполнения запросов в RavenDB. Просто создайте запрос linq - RavenDB динамически создаст для вас индекс без каких-либо дополнительных затрат.

Единственный вариант использования, где вы могли бы захотеть создать индекс самостоятельно, - это если вы хотите указать другой анализатор Lucene.NET, который будет выполнять то, что вы называете «полнотекстовым поиском» в поле Message.Content. , Но даже это должно быть так же просто, как просто создать linq-запрос для индекса и передать его в RavenDB при запуске. Если вы хотите узнать, как это сделать, я рекомендую ознакомиться с образцом Ayende RaccoonBlog или официальными документами, которые скоро будут обновлены (FYI -> ravendb / docs содержит новые документы).

...