Модуль схожести
Модель схожести (модель оценки/ранжирования) определяет, как оцениваются совпадающие документы. Схожесть применяется к каждому полю, то есть с помощью отображения можно определить различную схожесть для каждого поля.
Схожесть применима только для полей текстового типа и типа keyword.
Настройка пользовательской схожести считается функцией для опытных пользователей, и встроенных моделей схожести, как описано в similarity, скорее всего будет достаточно.
Настройка схожести
Большинство существующих или пользовательских моделей схожести имеют параметры конфигурации, которые можно настроить с помощью параметров индекса, как показано ниже. Параметры индекса можно указать при создании индекса или обновлении параметров индекса.
PUT /index
{
"settings": {
"index": {
"similarity": {
"my_similarity": {
"type": "DFR",
"basic_model": "g",
"after_effect": "l",
"normalization": "h2",
"normalization.h2.c": "3.0"
}
}
}
}
} Здесь мы настраиваем схожесть DFR, чтобы на нее можно было ссылаться как на my_similarity в отображениях, как показано в примере ниже:
PUT /index/_mapping
{
"properties" : {
"title" : { "type" : "text", "similarity" : "my_similarity" }
}
} Доступные модели схожести
Схожесть BM25 (по умолчанию)
Схожесть на основе TF/IDF, которая имеет встроенную нормализацию tf и, как предполагается, работает лучше для коротких полей (например, имен). Более подробную информацию см. в Okapi_BM25. Эта модель схожести имеет следующие параметры:
| | Управляет нелинейной нормализацией частоты терминов (насыщением). Значение по умолчанию — |
| | Управляет степенью, в которой длина документа нормализует значения tf. Значение по умолчанию — |
| | Определяет, игнорируются ли перекрывающиеся токены (токены с нулевым шагом позиции) при вычислении нормы. По умолчанию это значение true, то есть перекрывающиеся токены не учитываются при вычислении норм. |
Имя типа: BM25
Схожесть DFR
Модель схожести, реализующая фреймворк отклонения от случайности. Эта модель схожести имеет следующие параметры:
| | |
| | |
| |
Все параметры, кроме первого, нуждаются в значении нормализации.
Имя типа: DFR
Схожесть DFI
Модель схожести, реализующая модель расхождения от независимости. Эта модель схожести имеет следующие параметры:
| | Возможные значения |
При использовании этой модели схожести настоятельно рекомендуется не удалять стоп-слова, чтобы получить хорошую релевантность. Также имейте в виду, что термины, частота которых меньше ожидаемой частоты, получат оценку, равную 0.
Имя типа: DFI
Схожесть IB.
Информационная модель . Алгоритм основан на концепции, что информационное содержание в любой последовательности символьного распределения в первую очередь определяется повторяющимся использованием его основных элементов. Для письменных текстов эта задача будет соответствовать сравнению стилей письма разных авторов. Эта модель схожести имеет следующие параметры:
| | |
| | |
| | То же, что и в модели схожести |
Имя типа: IB
Схожесть LM Dirichlet.
Схожесть LM Dirichlet . Эта модель схожести имеет следующие параметры:
| | По умолчанию |
Формула подсчета баллов в статье присваивает отрицательные баллы терминам, которые имеют меньше вхождений, чем предсказывает языковая модель, что недопустимо для Lucene, поэтому такие термины получают оценку 0.
Имя типа: LMDirichlet
Схожесть LM Jelinek Mercer.
Схожесть LM Jelinek Mercer . Алгоритм пытается захватить важные закономерности в тексте, исключая шум. Эта модель схожести имеет следующие параметры:
| | Оптимальное значение зависит как от коллекции, так и от запроса. Оптимальное значение составляет около |
Имя типа: LMJelinekMercer
Схожесть на основе скриптов
Модель схожести, которая позволяет использовать скрипт для указания способа вычисления оценок. Например, приведенный ниже пример показывает, как переписать TF-IDF:
PUT /index
{
"settings": {
"number_of_shards": 1,
"similarity": {
"scripted_tfidf": {
"type": "scripted",
"script": {
"source": "double tf = Math.sqrt(doc.freq); double idf = Math.log((field.docCount+1.0)/(term.docFreq+1.0)) + 1.0; double norm = 1/Math.sqrt(doc.length); return query.boost * tf * idf * norm;"
}
}
}
},
"mappings": {
"properties": {
"field": {
"type": "text",
"similarity": "scripted_tfidf"
}
}
}
}
PUT /index/_doc/1
{
"field": "foo bar foo"
}
PUT /index/_doc/2
{
"field": "bar baz"
}
POST /index/_refresh
GET /index/_search?explain=true
{
"query": {
"query_string": {
"query": "foo^1.7",
"default_field": "field"
}
}
} Что дает:
{
"took": 12,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1.9508477,
"hits": [
{
"_shard": "[index][0]",
"_node": "OzrdjxNtQGaqs4DmioFw9A",
"_index": "index",
"_type": "_doc",
"_id": "1",
"_score": 1.9508477,
"_source": {
"field": "foo bar foo"
},
"_explanation": {
"value": 1.9508477,
"description": "weight(field:foo in 0) [PerFieldSimilarity], result of:",
"details": [
{
"value": 1.9508477,
"description": "score from ScriptedSimilarity(weightScript=[null], script=[Script{type=inline, lang='painless', idOrCode='double tf = Math.sqrt(doc.freq); double idf = Math.log((field.docCount+1.0)/(term.docFreq+1.0)) + 1.0; double norm = 1/Math.sqrt(doc.length); return query.boost * tf * idf * norm;', options={}, params={}}]) computed from:",
"details": [
{
"value": 1.0,
"description": "weight",
"details": []
},
{
"value": 1.7,
"description": "query.boost",
"details": []
},
{
"value": 2,
"description": "field.docCount",
"details": []
},
{
"value": 4,
"description": "field.sumDocFreq",
"details": []
},
{
"value": 5,
"description": "field.sumTotalTermFreq",
"details": []
},
{
"value": 1,
"description": "term.docFreq",
"details": []
},
{
"value": 2,
"description": "term.totalTermFreq",
"details": []
},
{
"value": 2.0,
"description": "doc.freq",
"details": []
},
{
"value": 3,
"description": "doc.length",
"details": []
}
]
}
]
}
}
]
}
} Хотя модели схожести на основе скриптов обеспечивают большую гибкость, существует ряд правил, которым они должны удовлетворять. Несоблюдение этих правил может привести к тому, что Elasticsearch будет молча возвращать неверные лучшие результаты или выходить из строя с внутренними ошибками во время поиска:
- Возвращаемые оценки должны быть положительными.
- При прочих равных условиях оценки не должны уменьшаться при увеличении
doc.freq. - При прочих равных условиях оценки не должны увеличиваться при увеличении
doc.length.
Вы могли заметить, что значительная часть вышеприведённого скрипта зависит от статистики, которая одинакова для каждого документа. Можно сделать вышеприведённый код немного более эффективным, предоставив weight_script, который будет вычислять независимую от документа часть оценки и будет доступен в переменной weight. При отсутствии weight_script, weight равно 1. weight_script имеет доступ к тем же переменным, что и script, за исключением doc, поскольку он должен вычислить независимый от документа вклад в оценку.
Ниже приведённая конфигурация даст те же tf-idf оценки, но будет немного более эффективной:
PUT /index
{
"settings": {
"number_of_shards": 1,
"similarity": {
"scripted_tfidf": {
"type": "scripted",
"weight_script": {
"source": "double idf = Math.log((field.docCount+1.0)/(term.docFreq+1.0)) + 1.0; return query.boost * idf;"
},
"script": {
"source": "double tf = Math.sqrt(doc.freq); double norm = 1/Math.sqrt(doc.length); return weight * tf * norm;"
}
}
}
},
"mappings": {
"properties": {
"field": {
"type": "text",
"similarity": "scripted_tfidf"
}
}
}
} Имя типа: scripted
Стандартное сходство
По умолчанию Elasticsearch будет использовать сходство, которое настроено как default.
Вы можете изменить стандартное сходство для всех полей в индексе при его создании:
PUT /index
{
"settings": {
"index": {
"similarity": {
"default": {
"type": "boolean"
}
}
}
}
} Если вы хотите изменить стандартное сходство после создания индекса, вам необходимо закрыть ваш индекс, отправить следующий запрос и открыть его снова после:
POST /index/_close?wait_for_active_shards=0
PUT /index/_settings
{
"index": {
"similarity": {
"default": {
"type": "boolean"
}
}
}
}
POST /index/_open
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/index-modules-similarity.html