Пользовательский ранкер.

Здравствуйте!

Есть несколько вопросов по плагину ранкера.

  1. Можно ли в функцию XXX_update() ранкера передать или получить доступ, каким-то образом, к атрибутам текущего документа? Например, в индексе есть атрибут rt_attr_string = guid.

  2. Что находится в поле doc_id структуры SPH_RANKER_HIT? У меня возвращает в этом поле не id, которые я передал с помощью INSERT, а числа 0,1,… Как будто они означают порядок, в котором я добавлял документы. Добавлял я их в индекс следующим образом:
    INSERT INTO myindex (id, guid, …) VALUES (153781677,‘8B0893A217DF76A7E0531D9AA8C0C4E9’,…);

  3. В поле query_pos(SPH_RANKER_HIT) учитываются позиции слов запроса не только тех, что даны пользователем, но и служебных(в моем случае чисел). Например, запрос:
    SELECT id, WEIGHT() FROM myindex WHERE MATCH(’“22К 734”~10|“4 1 208”~10’) OPTION ranker=my_ranker(’’);
    Для “22К 734” query_pos=1. А для “4 1 208” query_pos=4. Т.е. посчиталась позиция числа 10 - аргумента оператора близости. Если убрать ~10, то query_pos=3. Это баг или фича? :slight_smile:

  4. Хотелось бы, чтобы в будущем появилось описание полей структур SPH_RANKER_INIT, SPH_RANKER_HIT. В частности, не ясно что хранится в полях:
    а) SPH_RANKER_INIT: payload_mask, max_qpos;
    б) SPH_RANKER_HIT: node_pos, span_length, query_pos_mask.

Версия, на которой тестировалось Manticore 3.4.2.

Спасибо!

  1. нет, вы не можете использовать аттрибуты в XXX_update(), но вы можете использовать их в ranker = expr, примеры есть в test 184

  2. doc_id это row_id - внутренний идентификатор документа

  3. лучше передать ваш запрос в CALL KEYWORDS ('22К 734”~10|“4 1 208”~10', myindex ) чтобы убедится как токенизируется ваш запрос и что находится в позиции 4 - тк если там оператор - то это баг.

  4. payload_mask - это такая древность, что наверное им никто уже и не пользуется - описано в sql_joined_field - секции Payloads

по остальным опциям - лучше создать тикет на Github, чтобы быть в курсе прогресса.

  1. Т.е. получается нет способов в XXX_update() узнать для какого документа(имеется ввиду относительно моих id, или других атрибутов) данный hit?

  2. Результат вызова CALL KEYWORDS (‘22К 734”~10|“4 1 208”~10’, ‘myindex’);
    ±-----±----------±-----------+
    | qpos | tokenized | normalized |
    ±-----±----------±-----------+
    | 1 | 22к | 22к |
    | 2 | 734 | 734 |
    | 3 | 10 | 10 |
    | 4 | 4 | 4 |
    | 5 | 1 | 1 |
    | 6 | 208 | 208 |
    | 7 | 10 | 10 |
    ±-----±----------±-----------+

Выходит это баг.

  1. нет - сейчас получается, что нет - можете создать такет на Github?

  2. похоже в CALL KEYWORDS нет опции чтобы указать что надо разбирать как query а не как текст на индексацию и из-за этого не правильно разбирается запрос в случае CALL KEYWORDS - лучше тикет в Github создать для этого.

Сделал тикеты:
1,2) Passing doc_id (and possibly other attributes) to the user ranker - XXX_update (). · Issue #440 · manticoresoftware/manticoresearch · GitHub
3) In the SPH_RANKER_HIT structure in the query_pos field, positions of service words are taken into account. · Issue #441 · manticoresoftware/manticoresearch · GitHub
4) Description of fields and an example of a custom ranker plugin. · Issue #442 · manticoresoftware/manticoresearch · GitHub