Во второй части о оценке релевантности мы говорим о том, как позиции могут быть использованы для сопоставления и оценки.
Знание позиций слов в поле важно и может обеспечить лучшую релевантность. Позиции позволяют использовать широкий диапазон текстовых операторов, которые могут выполнять сопоставления либо по позиции слова относительно поля, либо путем вычисления расстояния между найденными ключевыми словами в пределах поля или по сравнению с вводимым запросом. Одним из самых часто используемых операторов, основанных на позициях, является оператор фразы - "A B"
. Сопоставления фраз являются ограничительными, так как они требуют, чтобы ключевые слова совпадали так, как указано в запросе. Это означает, что ключевые слова должны быть смежными и в том же порядке, что и в запросе.
Зная позицию слова, мы можем выполнять сопоставления, чтобы выяснить, есть ли поля, начинающиеся или заканчивающиеся на определенные слова, используя операторы начала (^) и конца($)
операторы
. Поиск в пределах поля также может быть ограничен, чтобы предоставить совпадение только в том случае, если слово найдено среди первых N слов поля. Это можно достичь, указав лимит после имени поля оператора - @myfield [10] word
. Мы также можем убедиться, что наши вводимые слова находятся в определенном порядке, используя оператор порядка - word1 << word2 << word3
, или если вводимые слова находятся в поле на заданном расстоянии, используя оператор близости: "word1 word2"~10
.
Совпадение близости позволяет иметь не более N слов между совпадающими ключевыми словами в поле. Например, "A B C"~4
совпадает с "A D E B F C"
, но не совпадает с "A D E B F G C"
.
Для менее ограничительной близости можно использовать оператор NEAR. В отличие от оператора близости, который работает с набором ключевых слов, NEAR работает с двумя операндами, которые могут быть словами или другими подвыражениями. Например, мы можем сделать "A B" NEAR/2 C
- совпадение действительно, если между фразой "A B"
и словом C
находится максимум 2 слова. Аналогично существует оператор NOTNEAR, который совпадает только тогда, когда между операндами (словами или подвыражениями) находится минимальное количество слов.
Несколько метрик релевантности используют позиции слов для вычисления расстояния между запросом и документом. LCS (Самая длинная общая подпоследовательность) дает длину максимального точного совпадения между документом и запросом. Это означает, что мы пытаемся выяснить, есть ли у нас подпоследовательности вводимого запроса в наших документах. Максимальное значение LCS равно количеству слов в запросе, если у нас есть точное его совпадение. Подпоследовательности будут давать меньшие значения LCS в зависимости от их длины, а наименьшее значение - 1 - это когда слова найдены, но не формируют никакой подпоследовательность больше 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. Поскольку позиции не совпадают, мы не можем говорить о 2 совпавших словах, чтобы сформировать подпоследовательность.
Более ограничительная версия LCS - это LCCS (Самая длинная общая смежная подпоследовательность). 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 или взвешенная наибольшая общая непрерывная подпоследовательность может суммировать IDF ключевых слов вместо простого подсчета. В отличие от LCS и LCCS, WLCCS принимает вещественные значения, так как IDF выражаются как вещественные числа, и вывод зависит от самих данных (так как IDF является мерой относительно текущего индекса). WLCCS даст лучшие значения подпоследовательностям, которые включают редкие слова, и может оценить документ выше, чем в случае, если бы использовались lcs или lccs, которые набрали бы меньший балл.
Мы ранее говорили об операторе, который может совпадать только когда ключевые слова начинаются с поля. Позиция первого вхождения также может быть использована в вычислении релевантности, так как это означает, что ключевое слово имеет большее значение для этого поля, если оно появляется раньше в поле или, что еще лучше, в начале него. min_hit_pos определяет позицию первого совпавшего ключевого слова. В выражениях рейтинга мы можем добавить проверку для min_hit_pos==1, чтобы проверить, происходит ли первое совпавшее ключевое слово в начале полей.