Здравствуйте.
Давно уже используем Manticoresearch (работает версия 6.3.6) для работы с адресами в системе. Загружаем их из ФИАС и строим полнотекстовый поиск по полной строке адреса. Более менее всё работало, но недавно наткнулись на необычное поведение ранжирования искомой строки, когда то, что ожидалось оказывается ниже чем, другие строки.
Итак, по порядку
DESCRIBE russia_fias_idx;
+---------------------+------------+--------------------------+
| Field | Type | Properties |
+---------------------+------------+--------------------------+
| id | bigint | |
| full_name | string | indexed stored attribute |
| name | string | indexed stored attribute |
| display_name | string | |
| custom_weight | uint | |
| json_tree | json | |
| full_name_length | uint | |
| aolevel | uint | |
| address_object_type | uint | |
| full_name_len | tokencount | |
| name_len | tokencount | |
+---------------------+------------+--------------------------+
Делаем запрос с кастомным ранжированием:
select id, display_name, custom_weight, WEIGHT() AS W
from russia_fias_idx where MATCH('г Владимир проезд 2-й Почаевский')
ORDER BY W DESC, full_name_len ASC, full_name_length ASC
LIMIT 5
OPTION ranker=expr('sum(exact_hit+lcs+custom_weight*0.1-min_gaps*0.1)*1000+bm25');
получаем результат:
+----------+------------------------------------------------------------------------------------------------------------------+---------------+------+
| id | full_name | custom_weight | w |
+----------+------------------------------------------------------------------------------------------------------------------+---------------+------+
| 17885772 | Российская Федерация, Владимирская обл, г Владимир, проезд 2-й Почаевский, д. 2 | 3 | 9159 |
| 24750954 | Российская Федерация, Владимирская обл, г Владимир, проезд 2-й Почаевский, д. 7, стр. 2 | 3 | 9159 |
| 32593543 | Российская Федерация, Владимирская обл, г Владимир, проезд 2-й Почаевский, д. 6а, стр. 2 | 3 | 9159 |
| 1201478 | Российская Федерация, Владимирская обл., г Владимир, проезд 2-й Почаевский | 10 | 8557 |
| 37929926 | Российская Федерация, Владимирская обл, г Владимир, проезд 2-й Почаевский, д. 5, к. 2 | 3 | 7857 |
+----------+------------------------------------------------------------------------------------------------------------------+---------------+------+
5 rows in set (0,124 sec)
Искомая строка почему-то оказывается на 4м месте.
Делал запрос с PACKEDFACTORS({json=1})
Для первой строки:
{
"bm25": 559,
"bm25a": 0.5581727,
"field_mask": 3,
"doc_word_count": 7,
"fields": [
{
"field": 0,
"lcs": 7,
"hit_count": 9,
"word_count": 7,
"tf_idf": 0.13068013,
"min_idf": -0.00691398,
"max_idf": 0.05496708,
"sum_idf": 0.12550066,
"min_hit_pos": 5,
"min_best_span_pos": 5,
"exact_hit": 0,
"max_window_hits": 1,
"min_gaps": 0,
"exact_order": 1,
"lccs": 7,
"wlccs": 0.12550066,
"atc": 0.00327622
},
{
"field": 1,
"lcs": 1,
"hit_count": 1,
"word_count": 1,
"tf_idf": 0.01209343,
"min_idf": 0.01209343,
"max_idf": 0.01209343,
"sum_idf": 0.01209343,
"min_hit_pos": 1,
"min_best_span_pos": 1,
"exact_hit": 0,
"max_window_hits": 1,
"min_gaps": 0,
"exact_order": 0,
"lccs": 1,
"wlccs": 0.01209343,
"atc": 0
}
],
"words": [
{
"tf": 1,
"idf": 0.00045326
},
{
"tf": 1,
"idf": 0.03094799
},
{
"tf": 1,
"idf": 0.01685472
},
{
"tf": 2,
"idf": -0.00691398
},
{
"tf": 3,
"idf": 0.01209343
},
{
"tf": 1,
"idf": 0.01709816
},
{
"tf": 1,
"idf": 0.05496708
}
]
}
Для искомой 4-й:
{
"bm25": 557,
"bm25a": 0.59452122,
"field_mask": 1,
"doc_word_count": 7,
"fields": [
{
"field": 0,
"lcs": 7,
"hit_count": 7,
"word_count": 7,
"tf_idf": 0.12550066,
"min_idf": -0.00691398,
"max_idf": 0.05496708,
"sum_idf": 0.12550066,
"min_hit_pos": 5,
"min_best_span_pos": 5,
"exact_hit": 0,
"max_window_hits": 1,
"min_gaps": 0,
"exact_order": 1,
"lccs": 7,
"wlccs": 0.12550066,
"atc": 0.00382692
}
],
"words": [
{
"tf": 1,
"idf": 0.00045326
},
{
"tf": 1,
"idf": 0.03094799
},
{
"tf": 1,
"idf": 0.01685472
},
{
"tf": 1,
"idf": -0.00691398
},
{
"tf": 1,
"idf": 0.01209343
},
{
"tf": 1,
"idf": 0.01709816
},
{
"tf": 1,
"idf": 0.05496708
}
]
}
Если сложить по формуле то веса сходятся, но почему так?