Индексация

После получения доступа к объекту, позволяющему произвести индексацию, необходимо подготовить контекст с настройками индексации. Для создания контекста вызовите метод IImportExecutor.CreateContext. В зависимости от того, что предполагается индексировать (структуры источников данных или метаданные объектов репозитория) необходимо результат метода привести к одному из двух интерфейсов: ISourceDataImportContext и IMbObjectsImportContext. Для указания параметров выполнения процесса индексации результат метода IImportExecutor.CreateContext также может быть приведён к интерфейсу ISolrImportContext.

Важно. В связи с имеющимися особенностями реализации языка Fore он не может быть использован для создания кода по индексированию объектов. Все дальнейшие примеры реализованы на языке Fore.NET.

Public Shared Sub Main(Params: StartParams);
Var
    //...
    MB: IMetabase;
    SharedParams: ISharedParams;
    SearchEngine: ISolrSearchEngineService;
    SearchSchema: ISolrSearchEngineSchema;
    ImportExecutor: IImportExecutor;
    SourceContext: ISourceDataImportContext;
    MbObjContext: IMbObjectsImportContext;
    Locales: Array = New Integer[1] = [LocaleCodeID.lcidRussian As Integer];
    //...
Begin
    //...
    MB := Params.Metabase;
    //Параметры поиска и индексации, заданные для репозитория
    SharedParams := MB.SpecialObject[MetabaseSpecialObject.msoSharedParams].Bind() As ISharedParams;
    SearchEngine := SharedParams.SearchEngine As ISolrSearchEngineService;
    SearchSchema := SearchEngine.SearchEngineSchema As ISolrSearchEngineSchema;
    //Для индексации источников данных
    ImportExecutor := SearchSchema.ImportExecutor[SearchEngineTargetType.settSourceData];
    SourceContext := ImportExecutor.CreateContext() As ISourceDataImportContext;
    //...
    //Для индексации метаданных объектов репозитория
    ImportExecutor := SearchSchema.ImportExecutor[SearchEngineTargetType.settMbObject];
    MbObjContext := ImportExecutor.CreateContext() As IMbObjectsImportContext;
    //...
    //Указания параметров выполнения процесса индексации
    (SourceContext As ISolrImportContext).CleanType := SolrImportCleanType.sictSpecified;
    (SourceContext As ISolrImportContext).Locales := Locales;
    (MbObjContext As ISolrImportContext).CleanType := SolrImportCleanType.sictNone;
    (MbObjContext As ISolrImportContext).Locales := Locales;
    //...
End Sub;

Индексация источников данных

Задать индексируемые объекты можно двумя способами: в свойстве ContainerKeys указать массив ключей объектов-контейнеров, в которых хранятся источники данных, или в коллекцию SourceInfos добавить необходимые источники и определить для них специфические настройки индексации. При использовании свойства ContainerKeys все источники индексируются с параметрами по умолчанию (используется вариант отображения по умолчанию, отсутствуют свободные измерения (кроме календарного), по измерениям выставлена максимальная отметка).

Указание объектов-контейнеров, в которых необходимо проиндексировать источники данных:

Public Shared Sub Main(Params: StartParams);
Var
    //...
    MB: IMetabase;
    SearchSchema: ISolrSearchEngineSchema;
    ImportExecutor: IImportExecutor;
    SourceContext: ISourceDataImportContext;
    Containers: Array = New Integer[2];
    //...
Begin
    //...
    MB := Params.Metabase;
    //...
    //Для индексации источников данных
    ImportExecutor := SearchSchema.ImportExecutor[SearchEngineTargetType.settSourceData];
    SourceContext := ImportExecutor.CreateContext() As ISourceDataImportContext;
    //Указание индексируемых объектов
    Containers[0] := MB.GetObjectKeyById("F_CUBES"As Integer;
    Containers[1] := MB.GetObjectKeyById("F_TSDB"As Integer;
    SourceContext.ContainerKeys := Containers;
    //...
End Sub;

Указание определенного источника данных и параметров индексации для него:

Public Shared Sub Main(Params: StartParams);
Var
    //...
    MB: IMetabase;
    SearchSchema: ISolrSearchEngineSchema;
    ImportExecutor: IImportExecutor;
    SourceContext: ISourceDataImportContext;
    Cube: ICubeModel;
    CubeDimensions: ICubeModelDimensions;
    CubeDimension: IDimensionModel;
    SourceInfo: ISourceDataImportInfo;
    DestinationInfo: ISourceDataImportDestinationInfo;
    DimSS: IDimSelectionSet;
    DimS: IDimSelection;
    i: Integer;
    //...
Begin
    //...
    MB := Params.Metabase;
    //...
    //Для индексации источников данных
    ImportExecutor := SearchSchema.ImportExecutor[SearchEngineTargetType.settSourceData];
    SourceContext := ImportExecutor.CreateContext() As ISourceDataImportContext;
    //Указание индексируемого источника данных
    Cube := MB.ItemById["STD_CUBE"].Bind() As ICubeModel;
    CubeDimensions := Cube.Destinations.DefaultDestination.Dimensions;
    SourceInfo := SourceContext.SourceInfos.Add(Cube);
    DestinationInfo := SourceInfo.DestinationInfos.Add(Cube.Destinations.DefaultDestination);
    //Параметры индексации варианта отображения
    DestinationInfo.GroupByDl := True;
    DestinationInfo.ImportMode := SourceImportMode.simFull;
    For i := 0 To CubeDimensions.Count - 1 Do
        CubeDimension := CubeDimensions.Item[i];
        Select Case (CubeDimension As IMetabaseObject).Id
            Case "FACTS": DestinationInfo.FreeDimensions.Add(CubeDimension);
            Case "INDICATORS""COUNTRY": DestinationInfo.KeyWordsDimensions.Add(CubeDimension);
        End Select;
    End For;
    //Установка отметки по измерениям
    DimSS := DestinationInfo.SelectionSet;
    For Each DimS In DimSS Do
        Select Case DimS.Dimension.Ident
            Case "FACTS""INDICATORS":
                DimS.SelectAll();
            Case "COUNTRY":
                DimS.SelectElement(0False);
                DimS.SelectElement(1False);
        End Select;
    End For;
    //...
End Sub;

После указания всех индексируемых источников настроенный контекст передайте в метод IImportExecutor.Import. При выполнении метода формируются необходимые документы, которые будут переданы для дальнейшей обработки и хранения в Apache Solr. При индексации автоматически используются те экземпляры Solr, которые соответствуют заданному назначению (назначение указывается во входном параметре метода IImportExecutor.CreateContext) и языкам (указываются в свойстве ISolrImportContext.Locales).

Public Shared Sub Main(Params: StartParams);
Var
    //...
    SearchSchema: ISolrSearchEngineSchema;
    ImportExecutor: IImportExecutor;
    SourceContext: ISourceDataImportContext;
    MbObjContext: IMbObjectsImportContext;
    //...
Begin
    //...
    //Для индексации источников данных
    ImportExecutor := SearchSchema.ImportExecutor[SearchEngineTargetType.settSourceData];
    SourceContext := ImportExecutor.CreateContext() As ISourceDataImportContext;
    //...
    //Настройка контекста
    //...
    ImportExecutor.Import(SourceContext);
    //...
    //Для индексации метаданных объектов репозитория
    ImportExecutor := SearchSchema.ImportExecutor[SearchEngineTargetType.settMbObject];
    MbObjContext := ImportExecutor.CreateContext() As IMbObjectsImportContext;
    //...
    //Настройка контекста
    //...
    ImportExecutor.Import(MbObjContext);
    //...
End Sub;

Индексация метаданных объектов репозитория

Задать объекты репозитория, для которых необходимо проиндексировать метаданные, можно несколькими способами:

После указания необходимых объектов настроенный контекст передайте в метод IImportExecutor.Import. При выполнении метода формируются необходимые документы, которые будут переданы для дальнейшей обработки и хранения в Apache Solr. При индексации автоматически используются те экземпляры Solr, которые соответствуют заданному назначению (назначение указывается во входном параметре метода IImportExecutor.CreateContext) и языкам (указываются в свойстве ISolrImportContext.Locales).

Public Shared Sub Main(Params: StartParams);
Var
    //...
    MB: IMetabase;
    Schema: ISolrSearchEngineSchema;
    ImportExecutor: IImportExecutor;
    MbObjContext: IMbObjectsImportContext;
    ObjectKeys: Array Of UInteger;
    //...
Begin
    //...
    //Для индексации метаданных объектов репозитория
    ImportExecutor := Schema.ImportExecutor[SearchEngineTargetType.settMbObject];
    MbObjContext := ImportExecutor.CreateContext() As IMbObjectsImportContext;
    //Индексируемые объекты
    ObjectKeys := New UInteger[2];
    ObjectKeys[0] := MB.GetObjectKeyById("REGIONS_DATA");
    ObjectKeys[1] := MB.GetObjectKeyById("CITY_DATA");
    MbObjContext.Keys := ObjectKeys;
    //Индексация
    ImportExecutor.Import(MbObjContext);
    //...
End Sub;

См. также:

Введение