В ELK под релевантсностью ( Relevance ) подразумевается то насколько актуальные данные вы получаете в ответе на ваши запросы.

Т.е допустим мы ищем поле title со значением one time, но в итоге получаем документы в которых присутствует одно из слов или оба слова. Соответсвенно релевантность такого запроса данных не высока.

Те документы, которые полностью соответвствуют требованиям поиска входят в число true positives.

Те документы, которые соответвствуют неполностью требованиям поиска входят в число false positives.

Те документы, которые не соответвствуют требованиям поиска входят в число false negatives.

Precision и Recall

Precision - это отношение true positives результатов к общему количеству возвращенных документов ( true positives плюс false positives ).

Precision - это та часть возвращенных документов, которая актуальна

Recall - это отношение true positives результатов к общему количеству документов, которые должны были быть возвращены (true positives результаты плюс false negatives).

Recall - это возвращенная часть соответствующих документов.

Другими словами, точность - это количество извлеченных релевантных документов, деленное на общее количество возвращенных документов. Отзыв - это количество извлеченных релевантных документов, деленное на общее количество релевантных документов.

GET my_index/_search
{ "query": {
  "match": {
    "content": {
      "query": "my node"
    }
  }
}}

Этот вариант запроса вернёт нам 1000 документов, в которых содержится одно из двух слов или оба.

Чтобы увеличить Precision для такого запроса можно использовать operator со значением and.

GET my_index/_search
{ "query": {
  "match": {
    "content": {
      "query": "my node",
      "operator": "and"
    }
  }
}}

Этот запрос вернет гораздо меньше документов. Соответсвенно релевантность такого поиска выше и вы повысили Precision. Оператор and означает что в поле content должны присутствовать оба слова, но не обязательно что подряд.

Также можно использовать minimum_should_match с цифровым значением, которое указывает количество слов котороые должны быть найдены в поле.

GET my_index/_search
{ "query": {
  "match": {
    "content": {
      "query": "my node by",
      "minimum_should_match": 2
    }
  }
}}

Т.е чтобы документ был найден в нём должно присутствовать минимум 2 слова из 3 в поле content.

Score

Также после сортировки можно заметить что у каждого документа присутствует роле _score с разными значениями.

Score - это значение, показывающее, насколько документ соответствует ( релевантность ) конкретному запросу. Вычисляется он по алгоритму BM25.

Score документа зависит от трех основных факторов:

  • TF (term frequency/частота термина): чем больше термин/слово находится в поле, тем важнее документ
  • IDF (inverse document frequency/обратная частота документов): чем больше документов содержит термин в `index’, тем менее важен термин
  • Field length/Длина поля: более короткие совпадающие поля будут более релевантными, чем более длинные.

Ниже поподробнее о 2 факторах.

Term frequency

Чем больше термин/слово появляется в поле, тем он важнее. Если слово встречается в документе несколько раз, его релевантность возрастает, так как оно должно быть более значимым, чем другие слова, которые появляются меньше.

Но после определенного момента многие - это просто многие. Оценка не должна существенно отличаться, если термин встречается 100 или 102 раза. Только если кратно 5.

Inverse Document Frequency

Чем больше документов содержит термин, тем менее важно, что этот термин в index. По сути, слово, которое встречается во многих документах, - это часто встречающийся термин, который не должен влиять на оценку так сильно, как редко встречающееся слово.

Total Hits

Начиная с версии 7.0, Elasticsearch по умолчанию ограничивает количество полей Total Hits до 10 000. Это было сделанно для более быстрой обработки запроса при работе с индексами с большим количеством документов.

GET _search

Чтобы понимать точное ли количество документов нам выданно, а не урезанно можно по полю relation. Которое может принимать:

  • eq означает, что value имеет правильное количество документов
  • gte означает, что количество совпадений может быть больше или равно счетчику в value

Чтобы вывести все документы если relation имеет значение gte можно воспользоваться track_total_hits выставив его в true

GET _search
{ "track_total_hits": true }