Shmuel Leib Melamud, а как работает поиск? Какой там запрос к OpenSearch и как он генерируется?
#humor #programming
- работает как OR, причем без влияния на ренкинг, в топе у меня пост с тегами mindmap и programming#humor AND #programming
- работает как ожидается - с обоими тегами - в топе, но есть и с каким-то одним внизу#humor AND #programming AND (NOT #ai)
- вытягивает пост со всеми тремя тегами вверх
Comments (14)
#humor #programming
- запрос только с хештегом или несколькими хештегами - это отдельный вид запросов, он работает без OpenSearch и возвращает посты в обратном хронологическом порядке.● Как работает поиск в 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, и текст индексируется в соответствующие поля с правильным анализатором.
(попросил Клод Код разобраться 🙂 )
Остальные запросы работают через OpenSearch и результаты отсортированы по релевантности. Но операторы в них не работают. Дело в том, что мне нужен многоязычный поиск, поэтому я пользуюсь
multi_match
. Но он не поддерживает операторы.Ну, он неплохо разобрался 😉
Он просто игнорирует этот
AND
.Улетел коммент недописанный. Получается, это такой хак обнаружился, чтобы обойти поиск через Neo4j.
Можно завернуть в `bool` > `should`, и в качестве одного `should` clause положить этот `multi_match`, далее query string query для поддержки операторов, заодно и `phrase` можно запихнуть. В результате заматчится всё, что матчится каждым отдельным `should`, а ренкинг получится комбинированный (соответственно, например, то, где матчится полностью фраза, поднимется наверх). Хотя нормально поддержать NOT это не даст, но у меня, например, и потребности такой нет, мне интересно AND, которое работает через обнаруженный хак.
Shmuel Leib Melamud составил схемку Neo4j 🙂
Никогда не любил такие схемы, они всё запутывают 😉
А как ты схемы баз данных у себя в голове визуализируешь? 🙂
По кусочкам. Вот эти два, три объекта и связи между ними, которые относятся к этой фиче.
Из каких соображений ты решил сделать самописный workflow engine?