← Timeline
Avatar
Tigra
Поисковик

Shmuel Leib Melamud, а как работает поиск? Какой там запрос к OpenSearch и как он генерируется?

  • #humor #programming - работает как OR, причем без влияния на ренкинг, в топе у меня пост с тегами mindmap и programming
  • #humor AND #programming - работает как ожидается - с обоими тегами - в топе, но есть и с каким-то одним внизу
  • #humor AND #programming AND (NOT #ai) - вытягивает пост со всеми тремя тегами вверх
To react or comment  View in Web Client
Comments (14)
Avatar
Shmuel Leib Melamud (updated )

#humor #programming - запрос только с хештегом или несколькими хештегами - это отдельный вид запросов, он работает без OpenSearch и возвращает посты в обратном хронологическом порядке.

👍1
Avatar

● Как работает поиск в Moera Search

Поиск реализован через два основных эндпоинта:

1. Полнотекстовый поиск (/search/entries/by-text)

Генерация запроса к OpenSearch:

1. MultiMatch запрос - основной поисковый запрос с учётом языка:
- Для русского текста: subject^2, text, mediaText, subjectRu^2, textRu, mediaTextRu
- Для английского: subject^2, text, mediaText
- Поле subject имеет boost=2 (более важное)
2. Фильтры (через bool.filter):
- Тип записи: posting или comment (через exists/not exists для commentId)
- Хештеги: точное совпадение по полю hashtags
- Публикаторы: по полям publishers или news
- Владельцы: по полю ownerName
- Ответы: по полю repliedToName
- Количество изображений: range запрос по imageCount
- Наличие видео: по полю videoPresent
- Дата создания: range запрос по createdAt
- Права доступа: по полю viewPrincipal (public или отсутствует)
3. Пагинация: через параметры from и size

2. Поиск по хештегам (/search/entries/by-hashtag)

Использует Neo4j напрямую без OpenSearch для более эффективной работы с графовой структурой.

Структура индекса

Документы в OpenSearch содержат:
- Текстовые поля с языковыми анализаторами (english/russian)
- Метаданные (ID, временные метки, владельцы)
- Медиа-информацию (количество изображений, наличие видео)
- Хештеги и права доступа

Язык текста определяется автоматически библиотекой Lingua, и текст индексируется в соответствующие поля с правильным анализатором.

👍1
Avatar
Avatar

Остальные запросы работают через OpenSearch и результаты отсортированы по релевантности. Но операторы в них не работают. Дело в том, что мне нужен многоязычный поиск, поэтому я пользуюсь multi_match. Но он не поддерживает операторы.

👍1
Avatar
Avatar
Avatar

Он просто игнорирует этот AND.

Avatar

Улетел коммент недописанный. Получается, это такой хак обнаружился, чтобы обойти поиск через Neo4j.

👍1
Avatar
Tigra (updated )

Можно завернуть в `bool` > `should`, и в качестве одного `should` clause положить этот `multi_match`, далее query string query для поддержки операторов, заодно и `phrase` можно запихнуть. В результате заматчится всё, что матчится каждым отдельным `should`, а ренкинг получится комбинированный (соответственно, например, то, где матчится полностью фраза, поднимется наверх). Хотя нормально поддержать NOT это не даст, но у меня, например, и потребности такой нет, мне интересно AND, которое работает через обнаруженный хак.

Query string
Query string query
OpenSearch DocumentationDOCS.OPENSEARCH.ORG
👍1
Avatar

Shmuel Leib Melamud составил схемку Neo4j 🙂

Avatar

Никогда не любил такие схемы, они всё запутывают 😉

Avatar

А как ты схемы баз данных у себя в голове визуализируешь? 🙂

Avatar

По кусочкам. Вот эти два, три объекта и связи между ними, которые относятся к этой фиче.

👍1
Avatar

Из каких соображений ты решил сделать самописный workflow engine?

To react or comment  View in Web Client