Индекс files_file (~39.8k док-в). Поля live: tenantId (не tenant_id), folders.folderId (строка), document.attachment.content (ingest-attachment,
только Office-форматы).
Тесты
Unit (file_es_test.go): builder запроса (name-only / content / фильтры /
лимит), парсер ответа и highlight, конфиг. PASS.
CLI (cmd/oo/search_test.go): регистрация команды и флагов, понятная ошибка
без ONLYOFFICE_ES_URL. PASS.
Integration (file_es_integration_test.go, //go:build integration, skip без ONLYOFFICE_ES_URL): заливает временный xlsx (токены в имени и в ячейке),
ждёт индексации, находит по имени и по контенту, проверяет highlight и что
name-only не находит content-токен, удаляет проект. PASS live (ES туннель).
go build ./... && go vet ./... && go test -race ./... — зелёные. gitleaks — чисто.
Не мержу и не закрываю.
Реализует F3 #37 (эпик #34): прямой Elasticsearch-клиент поиска по имени и содержимому документов + CLI `oo search`.
## Что сделано
- `file_es.go`: `ESSearcher` (stdlib net/http, ES REST 7.x). `Search(SearchQuery)`:
- `multi_match` по `title^2` и `document.attachment.content` (при `InContent`);
- фильтры `tenantId` и `folders.folderId`, `_source` id/title/folders;
- `highlight` (фрагмент, теги `<em>` срезаются);
- `[]SearchHit` + `Name() = "elasticsearch"`.
- Модель `Entry`/`Kind`/`SearchHit`/`SearchQuery`/`Searcher` — из F1 #35, локально в
`file_es.go` (F1 ещё не влит; переедет в `file_core.go` при мерже).
- Конфиг: `ONLYOFFICE_ES_URL`, `ONLYOFFICE_ES_INDEX` (default `files_file`),
`ONLYOFFICE_TENANT`; `.env.example` — только имена.
- CLI `oo search <query> [--content] [--folder id] [--limit N] [--json]` через
`printTable`/`printJSON`.
- `docs/elasticsearch.md` — устройство поиска, туннель, env, грабли.
## Доступ к ES (research, live)
- ES внутри VM OnlyOffice (`onlyoffice-v2`), `127.0.0.1:9200`, версия **7.16.3**,
cluster `elasticsearch`. Снаружи закрыт, SSH в VM — `127.0.0.1:32`.
- Туннель проверен: `ssh -f -N -o ControlMaster=no -o ControlPath=none -p 32 -i ~/.ssh/id_ed25519 -L 9200:127.0.0.1:9200 root@127.0.0.1`.
- Индекс `files_file` (~39.8k док-в). Поля live: `tenantId` (не `tenant_id`),
`folders.folderId` (строка), `document.attachment.content` (ingest-attachment,
только Office-форматы).
## Тесты
- Unit (`file_es_test.go`): builder запроса (name-only / content / фильтры /
лимит), парсер ответа и highlight, конфиг. PASS.
- CLI (`cmd/oo/search_test.go`): регистрация команды и флагов, понятная ошибка
без `ONLYOFFICE_ES_URL`. PASS.
- Integration (`file_es_integration_test.go`, `//go:build integration`, skip без
`ONLYOFFICE_ES_URL`): заливает временный xlsx (токены в имени и в ячейке),
ждёт индексации, находит по имени и по контенту, проверяет highlight и что
name-only не находит content-токен, удаляет проект. **PASS live** (ES туннель).
- `go build ./... && go vet ./... && go test -race ./...` — зелёные. gitleaks — чисто.
Не мержу и не закрываю.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Реализует F3 #37 (эпик #34): прямой Elasticsearch-клиент поиска по имени и содержимому документов + CLI
oo search.Что сделано
file_es.go:ESSearcher(stdlib net/http, ES REST 7.x).Search(SearchQuery):multi_matchпоtitle^2иdocument.attachment.content(приInContent);tenantIdиfolders.folderId,_sourceid/title/folders;highlight(фрагмент, теги<em>срезаются);[]SearchHit+Name() = "elasticsearch".Entry/Kind/SearchHit/SearchQuery/Searcher— из F1 #35, локально вfile_es.go(F1 ещё не влит; переедет вfile_core.goпри мерже).ONLYOFFICE_ES_URL,ONLYOFFICE_ES_INDEX(defaultfiles_file),ONLYOFFICE_TENANT;.env.example— только имена.oo search <query> [--content] [--folder id] [--limit N] [--json]черезprintTable/printJSON.docs/elasticsearch.md— устройство поиска, туннель, env, грабли.Доступ к ES (research, live)
onlyoffice-v2),127.0.0.1:9200, версия 7.16.3,cluster
elasticsearch. Снаружи закрыт, SSH в VM —127.0.0.1:32.ssh -f -N -o ControlMaster=no -o ControlPath=none -p 32 -i ~/.ssh/id_ed25519 -L 9200:127.0.0.1:9200 root@127.0.0.1.files_file(~39.8k док-в). Поля live:tenantId(неtenant_id),folders.folderId(строка),document.attachment.content(ingest-attachment,только Office-форматы).
Тесты
file_es_test.go): builder запроса (name-only / content / фильтры /лимит), парсер ответа и highlight, конфиг. PASS.
cmd/oo/search_test.go): регистрация команды и флагов, понятная ошибкабез
ONLYOFFICE_ES_URL. PASS.file_es_integration_test.go,//go:build integration, skip безONLYOFFICE_ES_URL): заливает временный xlsx (токены в имени и в ячейке),ждёт индексации, находит по имени и по контенту, проверяет highlight и что
name-only не находит content-токен, удаляет проект. PASS live (ES туннель).
go build ./... && go vet ./... && go test -race ./...— зелёные. gitleaks — чисто.Не мержу и не закрываю.