Как и в большинстве случаев с Lucene, решение состоит в том, чтобы использовать несколько полей - одно поле с расширенными синонимами и одно без.Таким образом, вы можете решить, выполнять ли поиск с включенными синонимами вообще, или вы можете оценивать попадания в разных полях с разными весами - и вы можете корректировать эти веса на основе вашего запроса.В Solr вы использовали copyField
для индексации одного и того же контента в обоих полях, а затем вы можете отрегулировать весовые коэффициенты при использовании edismax с field^5 field_with_synonyms
для оценки попаданий без синонимов в пять раз выше, чем с синонимами.
Если вы действительно хотите сделать это в одном, одном поле, потребуется гораздо более хрупкая и настраиваемая настройка, где вы можете использовать полезные нагрузки, прикрепленные к каждому токену , чтобы вручную оценить каждыйтокен по-другому, но это более сложный вариант использования, который не будет вписываться в остальную функциональность.Это решит ваш PS
вариант использования.Я также рекомендовал бы проверить одну из презентаций Lucene / Solr Revolution о вариантах использования для оценки полезной нагрузки.
Использование двух полей - это простой способ, использование полезных нагрузок - более гибкая,но также более продвинутый способ.
Возвращает значение с плавающей запятой, вычисленное из декодированных полезных нагрузок указанного термина.
Возвращаемое значение вычисляется с использованием min, max илисреднее из декодированных полезных нагрузок.Специальная первая функция может использоваться вместо других для короткого замыкания перечисления терминов и возврата только декодированной полезной нагрузки первого члена.
Указанное поле должно иметь возможность кодирования с плавающей или целочисленной полезной нагрузкой (через DelimitedPayloadTokenFilter или NumericPayloadTokenFilter).Если полезная нагрузка для термина не найдена, возвращается значение по умолчанию.
payload(field_name,term)
: значение по умолчанию - 0,0, используется средняя функция.
payload(field_name,term,default_value)
: значение по умолчанию может бытьконстанта, имя поля или другая функция, возвращающая число с плавающей точкой.используется средняя функция.
payload(field_name,term,default_value,function)
: значения функции могут быть минимальными, максимальными, средними или первыми.
Файл, используемый с DelimitedPayloadTokenFilter, имеет формат token|payload
и позволяет вам присоединить любое числовое значение в качестве «полезной нагрузки» для этого токена.