1. Конфигурация системы

1.1 Конфигурационный файл appsettings.json
Для настройки порта и интерфейса необходимо в "Bsa.Search.Api"."Host" указать порт и IP адрес или DNS на котором будет хостится система
По умолчанию все интерфейсы и порт 2664

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "Bsa.Search.Api": {
    "Host": "http://+:2664"
  },
  "profiles": {
    "bsa_search_api": {
      "commandName": "BsaSearch",
      "dotnetRunMessages": "true",
      "launchBrowser": true,
      "launchUrl": "swagger",
      "applicationUrl": "http://+:2664",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

1.2 Конфигурация уровня логирования и местоположения логов NLog.config

Для уменьшения нагрузки на дисковую систему уровни логирования следует с Info повысить до Warn.

По умолчанию 3 уровня логирования:
- в консоль ColoredConsole-Trace, уровень логирования Info (все события)
- в файла FlatFile-Trace, уровень логирования Info (все события)
- в файл FlatFile-Error, уровень логирования Error (только ошибки)
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 
    <targets>
        <target xsi:type="ColoredConsole"
                name="ColoredConsole-Trace"
                layout="${longdate} ${uppercase:${level}} ${logger} ${message}"
                useDefaultRowHighlightingRules="true" />
 
        <target xsi:type="File"
                name="FlatFile-Trace"
                layout="${longdate} ${uppercase:${level}} ${logger} ${message}"
                fileName="/Logs/Bsa.Search.Api.Host/${shortdate}-Trace.log"
                keepFileOpen="false"
                encoding="UTF-8" />
 
        <target xsi:type="File"
                name="FlatFile-Error"
                layout="${longdate} ${uppercase:${level}} ${logger} ${message} ${exception:format=tostring}"
                fileName="/Logs/Bsa.Search.Api.Host/${shortdate}-Errors.log"
                keepFileOpen="false"
                encoding="UTF-8" />
 
 
    </targets>
 
    <rules>
        <logger name="*" minlevel="Info" writeTo="ColoredConsole-Trace" />
        <logger name="*" minlevel="Info" writeTo="FlatFile-Trace" />
        <logger name="*" minlevel="Error" writeTo="FlatFile-Error" />
    </rules>
</nlog>


1.3 Конфигурация поисковых индексов searchServiceManager.json

{
  "ClearMemoryInterval": "00:01:00",
  "CloseIndexInterval": "00:30:00",
  "IndexLiveInterval": 60,
  "NeedCloseIndex": "true",
  "UseLocalTermRepository": "true",
  "PercentMemoryUsage": 80,
  "ShardCount": 16,
  "AvailablePhysicalMemory": 64000,
  "IndexFolder": "Data\\searchindex"
}

Где:

ClearMemoryInterval - интервал освобождения кэша поисковых индексов

CloseIndexInterval - интервал проверки времени жизни индекса связан с IndexLiveInterval 


IndexLiveInterval - время жизни индекса в минутах, если индекс не используется в заданный интервал времени он закрывается

UseLocalTermRepository - использовать локальный репозиторий для хранения термов, иначе необходимо передать внешний репозиторий

PercentMemoryUsage - процент используемой памяти от максимально возможного AvailablePhysicalMemory в процентах

ShardCount - количество шард в индексе, на текущий момент возможны 2 варианта значений 1 или 16


AvailablePhysicalMemory - максимально доступный объем оперативной памяти на компьютере в МБ, после которого будет инициирован процесс очистки памяти (закрытия индексов) 

IndexFolder - место нахождения индексов

2. Информация о системе методы апи

GET /api/v1/search/version - проверка версии
GET /api/v1/search/state?index=test - получение информации о конкретном индексе
GET /api/v1/search/info - информация о всех индексах

Список всех доступных методов http://localhost:2664/swagger/index.html

3. Возмодные проблемы в процессе эксплуатации

3.1 Нехватка оперативной памяти

Ситуация может возникнуть, если пользователь использует большое количество поисковых запросов с wildcard, на большом индексе, связана с тем что большие колекции в .net живут до момента пока не законичится RAM или не будет вызвана принудительная очистка 2 поколения, система выполняет принудительную очистку только при достяжение порога в используемой памяти AvailablePhysicalMemory*PercentMemoryUsage.
При уменьшение параметра AvailablePhysicalMemory или PercentMemoryUsage, может произойти замедление работы поиска из-за постоянного выполнения сборки мусора.

3.2 Нехватка дискового пространства 

Индексы хранятся согласно данных, которые указаны в кофигурационном файле searchServiceManager.json параметр IndexFolder.
Можно удалить *.back файлы, если не запущен процесс переиндексации, проверить это можно методом GET /api/v1/search/info

3.3 Проблема индексации не текстовых документов

Если на вход системы будет подан документ информация в котором будет идти без разрывов, т.е. текст будет единым словом на несколько МБ или ГБ.
Это может привести к проблеме с потреблением оперативной памяти.


4. Структура файлового хранилища

Каждый индекс содержит следующие файлы
terms.info  - список всех термов с инкрементальными Id, zerobase 
Terms.nbidb - бинарная информация о термах и документах, в которых они находятся 
ShortDocuments.idb - бинарная информация об индексируемых файлах, без исходной информации(только термы, поля)
Meta.info - метоинформация об индексе, количество документов
ExternalIds.bidb - информация о внешних идентификаторах
.brow - содержат бинарную информацию, о нахождение того или иного идентификатора (индексные файлы)
.back - файлы в которых сохраняются бакапы при выполнение операции Reindex(операция переиндексации запускается после перезапуска системы, если индекс становится не оптимальным, чтобы уменьшить дисковое чтение)

5. Клиенты для работы с API

.Net Standart 2.0 https://www.nuget.org/packages/Bsa.Search.Core.Rest

