Во второй части об оценке релевантности мы рассказываем, как позиции могут использоваться для сопоставления и оценки.
Знание позиций слов в поле важно и может обеспечить более высокую релевантность. Позиции позволяют использовать широкий набор текстовых операторов, которые могут выполнять совпадения либо по позиции слова относительно поля, либо рассчитывая расстояние между найденными ключевыми словами внутри поля или по сравнению с входным запросом. Одним из самых часто используемых операторов, основанных на позициях, является оператор phrase — "A B". Совпадения по фразе являются ограничительными, так как они требуют, чтобы ключевые слова совпадали точно так, как указано в запросе. Это означает, что ключевые слова должны быть соседними и находиться в том же порядке, что и в запросе.
Зная позицию слова, мы можем выполнять совпадения, чтобы определить, есть ли поля, начинающиеся или заканчивающиеся определёнными словами, используя оператор начала (^) и конца ($)
операторы
. Поиск внутри поля также может быть ограничен, предоставляя совпадение только если слово найдено среди первых N слов поля. Это можно достичь, указав ограничение после оператора имени поля — @myfield [10] word. Мы также можем убедиться, что наши входные слова находятся в определённом порядке, используя оператор порядка — word1 << word2 << word3, или если входные слова находятся в поле на заданном расстоянии, используя оператор proximity: "word1 word2"~10.
Оператор proximity позволяет иметь не более N слов между совпадающими ключевыми словами в поле. Например, "A B C"~4 совпадает с "A D E B F C", но не с "A D E B F G C".
Для менее ограничительного расстояния можно использовать оператор NEAR. В отличие от оператора proximity, который работает с набором ключевых слов, NEAR работает с двумя операндами, которые могут быть словами или другими подвыражениями. Например, можно написать "A B" NEAR/2 C — совпадение считается валидным, если между фразой "A B" и словом C находится максимум 2 слова. Аналогично существует оператор NOTNEAR, который совпадает только когда между операндами (словами или подвыражениями) имеется минимум слов.
Несколько метрик релевантности используют позиции слов для расчёта расстояния между запросом и документом. LCS (Longest Common Subsequence) даёт длину максимального дословного совпадения между документом и запросом. Это означает, что мы пытаемся найти, есть ли подпоследовательности входного запроса в наших документах. Максимальное значение LCS равно количеству слов в запросе, если имеется точное совпадение. Подпоследовательности дают более низкие значения LCS в зависимости от их длины, а наименьшее значение — 1 — когда слова найдены, но не образуют подпоследовательность длиннее одного слова. Стоит учитывать, что подпоследовательность не обязана состоять из соседних совпавших слов. Например, если в запросе A B C, а в документе найдено A D C, эта подпоследовательность получит оценку 2, потому что A и C найдены в порядке и на тех же позициях, что и в запросе:
mysql> SELECT *,WEIGHT() FROM testrt WHERE MATCH('hello world program') OPTION ranker=expr('top(lcs)');
+------+--------------------------+----------------------------+----------+
| id | title | content | weight() |
+------+--------------------------+----------------------------+----------+
| 6 | hello world program | just some content | 3 |
| 4 | hello test program | just some world content | 2 |
| 5 | hello test world program | just some content | 2 |
| 9 | hello world | just program world content | 2 |
| 7 | hello test world | just program some content | 1 |
| 8 | test program hello | just some world content | 1 |
+------+--------------------------+----------------------------+----------+
6 rows in set (0.00 sec)
Документ 4 имеет LCS в заголовке со значением 2, потому что наш запрос — hello world program, а подпоследовательность — hello test program — даже если есть слово, которого нет в списке совпадений, слова hello и program находятся на своих позициях (1 и 3) и между ними.
Документ 7 с hello test world, хотя содержит 2 слова (hello и world) в порядке, их позиции — 1 и 3, тогда как в запросе позиции — 1 и 2. Поскольку позиции не совпадают, мы не можем говорить о двух совпавших словах, образующих подпоследовательность.
Более ограничительная версия LCS — LCCS (Longest Common Contiguous Subsequence). LCCS оценивает только подпоследовательности, образованные соседними словами. Чтобы проиллюстрировать разницу, возьмём предыдущий пример, но теперь с LCCS:
mysql> select *,weight() from testrt where match('hello world program') option ranker=expr('top(lccs)');
+------+--------------------------+----------------------------+----------+
| id | title | content | weight() |
+------+--------------------------+----------------------------+----------+
| 6 | hello world program | just some content | 3 |
| 5 | hello test world program | just some content | 2 |
| 9 | hello world | just program world content | 2 |
| 4 | hello test program | just some world content | 1 |
| 7 | hello test world | just program some content | 1 |
| 8 | test program hello | just some world content | 1 |
+------+--------------------------+----------------------------+----------+
6 rows in set (0.00 sec)
Теперь у документа 4, у которого был LCS=2, LCCS=1, поскольку хотя есть подпоследовательность и слова находятся на тех же позициях, они не являются соседними.
И LCS, и LCCS считают каждое ключевое слово равным 1 в формуле, не учитывая информацию о важности (насколько слово редкое или распространённое). Вариация LCCS под названием WLCCS (Weighted Longest Common Contiguous Subsequence) может суммировать IDF ключевых слов вместо простого подсчёта. В отличие от LCS и LCCS, WLCCS использует значения с плавающей точкой, поскольку IDF выражаются как float, и результат зависит от самих данных (так как IDF — это мера, относительная текущему индексу). WLCCS даст более высокие значения подпоследовательностям, включающим редкие слова, и может повысить рейтинг документа, который иначе с использованием LCS или LCCS получил бы более низкую оценку.
Мы ранее говорили об операторе, который может совпадать только когда ключевые слова начинаются в поле. Позиция первого вхождения также может использоваться в расчёте релевантности, так как это указывает, что ключевое слово имеет большую важность для поля, если появляется раньше в поле или, что ещё лучше, в начале его. min_hit_pos указывает позицию первого совпавшего ключевого слова. В выражениях ранжирования мы можем добавить проверку min_hit_pos==1, чтобы проверить, происходит ли первое совпавшее ключевое слово в начале полей.
Самая ранняя позиция также может применяться к подпоследовательностям. Представьте, что у нас есть несколько документов, которые дают нам подпоследовательности, совпадающие с запросом (частично или полностью), и мы хотим узнать, в каких документах подпоследовательности появляются раньше в полях. Для этого можно использовать min_best_span_pos, который возвращает первое вхождение лучшей подпоследовательности (рассчитанной как LCS) в поле.