BooleanQuery setDisableCoord

Я понятия не имею, что такое setDisableCoord и какое значение я должен установить для него. Я понимаю координацию в простом запросе (например, запрос TFIDF). Но не понимаю, что это значит в булевом запросе, состоящем из нескольких запросов.

Чтобы дать некоторый контекст, предположим следующие два сценария. Какое значение я должен установить в setDisableCoord для каждого из них?

  1. В первом сценарии у меня есть запрос с BooleanClause.Occur.FILTER (запрос используется только для фильтрации) и еще один для оценки (BooleanClause.Occur.MUST). В этом сценарии первый запрос только проверяет, находится ли поле «год» документа в указанном диапазоне, а второй запрос использует некоторый алгоритм для ранжирования.
  2. Во втором сценарии у меня есть два запроса с BooleanClause.Occur.SHOULD, оценки которых должны быть объединены для получения окончательной оценки поиска документов.

person Shayan    schedule 10.09.2016    source источник


Ответы (1)


Резюме. Для Lucene > 6.x установите для параметра disableCoord значение true, в противном случае оставьте значение false.

Coord — это функция оценки BooleanQuery для противодействия некоторым недостаткам TF/IDF для перенасыщенных терминов. Это актуально только для нескольких предложений must. В вашем первом сценарии все подзапросы должны совпадать, фактор координат не задействован, а параметр disableCoord не действует. Во втором сценарии, при наличии нескольких предложений «должен», BooleanQuery суммирует все промежуточные баллы, чтобы определить, какой из документов лучше соответствует. Идея состоит в том, что документ, который соответствует большему количеству подзапросов, является лучшим соответствием и, следовательно, получает более высокий балл.

Теперь представьте запрос x OR y и документ, в котором 1000 раз встречается x, но ни одного y. При использовании TF/IDF, из-за высокого termFreq(x), дополнительный балл x очень высок, как и результирующий балл x OR y, который может продвигать этот документ перед другими, которые соответствуют обоим полям, а это не то, для чего предназначался BooleanQuery. делать. Здесь в игру вступает координата.

Коэффициент координат рассчитывается для каждого документа как number of should clauses matched/total number of should clauses in query. Это в основном дает число в [0..1], которое представляет, сколько подзапросов соответствует документу. Суммарный балл всех подзапросов затем умножается на этот координатный коэффициент. Документ, соответствующий всем предложениям must, будет иметь первоначальную оценку всех суммированных подзапросов, а документ, соответствующий только x из x OR y, будет иметь вдвое уменьшенную оценку, противодействуя высокой оценке, которую дал перенасыщенный x. Если вы отключили координаты, этот фактор не будет рассчитываться, и окончательный балл будет представлять собой только сумму промежуточных баллов.

Coord был разработан с учетом TF/IDF, и другие формулы подобия могут не страдать от перенасыщения терминов. BM25, который стал аналогом по умолчанию в Lucene 6.0, гораздо лучше контролирует такие перенасыщенные термины, контролируемые его параметр k1. Вместо оценки, которая растет почти линейно с увеличением termFreq, BM25 приближается к пределу и прекращает расти. Он не дает повышения для документов с termFreq=1000 по сравнению с документом с termFreq=5, но делает это для termFreq=1 по сравнению с termFreq=0. Бритта Вебер выступила с рассказом на модных словечках об этом, где она объяснила кривую насыщения.

Это означает, что для BM25 фактор координат больше не нужен и может фактически привести к нелогичным результатам. Он уже удален из мастера Lucene и исчезнет в версии 7.0.

Если вы используете Lucene 6.x с аналогом по умолчанию BM25, рекомендуется всегда отключать координацию, так как BM25 не страдает от проблемы с координацией, которую удалось обойти. Если вы используете TF/IDF (независимо от версии 6.x или нет), отключение coord даст вам более предсказуемые результаты только в том случае, если ваши частоты терминов равномерно распределены (чего практически никогда не бывает), а установка disableCoord на false default) даст результаты, которые интуитивно лучше.

person knutwalker    schedule 11.09.2016
comment
Только два момента: 1- Не могли бы вы дать мне ссылку на Координационный фактор рассчитывается для каждого документа как количество совпадающих предложений / общее количество предложений в запросе, 2- Что называется совпадением в lucene? Рассмотрим предложение с оценкой поиска 10^-7. Это совпадение? Какой тогда порог? - person Shayan; 12.09.2016
comment
Совпадение относится к тому, существует ли документ в общем наборе результатов, независимо от его оценки, это решение 0/1. Оценка предназначена только для измерения того, насколько хорошо совпадение, но порога нет, если только вы не реализуете его на уровне приложения. BooleanWeight делегирует вычисление координат классу подобия, а TF/IDF является классическим сходством (реализовано как перекрытие/maxOverlap): lucene.apache.org/core/6_2_0/core/org/apache/lucene/search/ - person knutwalker; 12.09.2016
comment
Сходство по умолчанию просто возвращает 1, что на самом деле также использует BM25: Сходство по умолчанию просто возвращает 1: lucene.apache.org/core/6_2_0/core/org/apache/lucene/search/ - person knutwalker; 12.09.2016
comment
Но BooleanWeight делегирует вычисление своей координаты классу подобия. Фактор координаты рассчитывается для каждого документа как количество совпадающих предложений «следует»/общее количество предложений «следует» в запросе. 1- Какой из них правильный? 2- Приведет ли установка setDisableCoord к true, чтобы сходство, используемое во всех предложениях (например, TFIDF), также не использовать coord? - person Shayan; 14.09.2016
comment
BooleanWeight делегирует координату подобия. До Lucene 5.x сходство по умолчанию (tf/idf) использует коэффициент matched / total, поэтому оба утверждения верны. Начиная с Lucene 6.x, сходство по умолчанию изменилось (bm25, больше нет tf/idf) и теперь всегда будет возвращать 1. Установка disableCoord в значение true даст тот же результат (всегда 1) для всех версий и сходств Lucene. Поскольку он больше не имеет никакого эффекта, параметр disableCoord исчезнет в версии 7.0. - person knutwalker; 14.09.2016