yopp
в смысле ключ добавляет на каждый токен, где постфикс указатель но документ?
yopp
сто токенов, сто ключей?
yopp
понятно
Gor
Вчера спать ушёл с этой мыслей, щя вот проснулся думаю
yopp
да не очень много вариантов для текстовых индексов то
Gor
Надо заглянуть внутренность инде са проверить но по коду - он тупо обычная колекция
Gor
Индекс открывают как коллекцию в коде
yopp
ну это легко проверить
Gor
yopp
если есть .wt хранилище, то его можно через wt посмотреть
Gor
yopp
wt -h /dbPath/ list
yopp
и там дальше wt -h /dbPath/ dump <entity_name>
yopp
и там усё видно будет
Gor
Ага, буду пробовать посмотреть
yopp
но скорее это прост индекс но с другим форматом кодирования ключей
yopp
но если это и правда коллекция, то это объясняет почему там пересечения нет и почему «много переписывать» ;)
Gor
Дам знать, но реально код странновато выглядет.
Gor
В 3.6 они там добавили хак забавный
Gor
Щя под рукой нет issue номера
Gor
Вообщем stage_text_or меняется на stage_or +fetch если не требуется score. И только потом в stage_text_match отдаётся
Gor
Это помогло ускорить выборки, score когда не нужен
Gor
Я вот сейчас на все это дело смотрю и задаю вопрос, почему не сделать обычный индекс по каждому токену, потом обычные and or операции поиска по индексу на основе семантики терминов и фраз в запросе, а после убирания дубликата документов или отсечение лишних на and, уже гнать и то, если надо, операции case sensitive сравнений
yopp
причины!
yopp
вообще текстовые индексы это задачи пересечения множества множеств
Gor
Вообще в идеале надо связку токен-> список документов.
yopp
так обычно оно так и есть
Gor
Блин надо до компа добраться. Неужели потому они и используют коллекцию
yopp
в обычных не уникальных индексах storage id документа кодируется в префиксе
yopp
тьфу
yopp
постфиксе
yopp
в уникальных индексах складывается в значение
yopp
да. и сразу дедупликация есть
yopp
т.е. один документ с одним префиксом будет в индексе один раз
Gor
Что логично
yopp
но по этому уникальный индекс может быть на копеечки эффективнее на fetch запросах. так как не надо scan делать
Gor
Надо перекопать и может получится сделать свою реализацию с индексацией по токенам но без коллекции а обычным btree но по токенам с ссылкой на документ. Так же как для array делается индекс
yopp
да не надо даже ничего городить
Gor
Ведь по сути тогда задача сводится к - виртуальному в неком смысле создания массива токенов по которому стоит индекс и в котором уже идёт поиск $in
yopp
просто в массив складывать словоформы нормализированыне и по ним индекс ;)
yopp
но я не вижу смысла
Gor
yopp
есть нормальные готовые решения, в которые можно скормить документы и айдишники
yopp
и искать там
Gor
yopp
ну
Gor
Условия по другим ну пусть будет атрибутам
yopp
мы получили из хранилища список айдишников и в $in их
yopp
вообще мы когда делали такое, мы просто весь документ целиком индексировали
Gor
yopp
распилили весь документ, вместе с ключами, положили в массив и вот пожалуйста
Gor
И вопрос индексации и создания выборки фасетной
yopp
отлично работало. словоформы не делали, был только prefix search
Gor
yopp
нет, прямо в монге
Gor
yopp
возможно даже какимнибудь страшным мапредьюсом с мержем
yopp
есть у меня ощущение что мы это в отдельную коллекцию свалилвали
Gor
yopp
не особо
Gor
Ну зависит. Например размер всего документа мог быть лимитом и ещё копию по сути иметь в елемента документа это как то много
yopp
но тогда времена были совсем другие, трава ещё не была зелёной, был mmapv1, до какого-то момента даже пересечения индексов не было)
Gor
В итоге fetch если без прямого указания полей на выборку не слабый такой мог быть по трафику
yopp
у нас документы не очень большие были и там было всё примерно одниаковое
yopp
ну может где-то тыща элементов бы набиралась
Gor
Тогда да. Вообщем как бы интересный и логичный вариант, который я рассматривал раньше - распилить документ на keywords и сделать их отдельным массивом с индексом.
Gor
Но стало интересно и пошёл колупать монго... опять:)
yopp
да вобщем-то текстовый индекс тоже так умеет
yopp
там же есть ** индекс
yopp
оно весь документ и распиливает)
Gor
там же есть ** индекс
Да, но работает текстовый индекс по другому - он же гонит все токен совпадения сначала в память а потом уже делает семантический анализ результата
Gor
А тут можно будет $in and $nin
yopp
я сомневаюсь что это будет как-то быстрее
Gor
Или там что то типа не больше одного
Gor
Или там другое- один текстовый или 1 неар или 1 индекс on array