Spec-Zone.ru › Elasticsearch 7
›Руководство по Elasticsearch [7.17] ›Модули индексов

Модуль схожести

Модель схожести (модель оценки/ранжирования) определяет, как оцениваются совпадающие документы. Схожесть применяется к каждому полю, то есть с помощью отображения можно определить различную схожесть для каждого поля.

Схожесть применима только для полей текстового типа и типа 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. Эта модель схожести имеет следующие параметры:

k1

Управляет нелинейной нормализацией частоты терминов (насыщением). Значение по умолчанию — 1.2.

b

Управляет степенью, в которой длина документа нормализует значения tf. Значение по умолчанию — 0.75.

discount_overlaps

Определяет, игнорируются ли перекрывающиеся токены (токены с нулевым шагом позиции) при вычислении нормы. По умолчанию это значение true, то есть перекрывающиеся токены не учитываются при вычислении норм.

Имя типа: BM25

Схожесть DFR

Модель схожести, реализующая фреймворк отклонения от случайности. Эта модель схожести имеет следующие параметры:

basic_model

Возможные значения: g, if, in и ine.

after_effect

Возможные значения: b и l.

normalization

Возможные значения: no, h1, h2, h3 и z.

Все параметры, кроме первого, нуждаются в значении нормализации.

Имя типа: DFR

Схожесть DFI

Модель схожести, реализующая модель расхождения от независимости. Эта модель схожести имеет следующие параметры:

independence_measure

Возможные значения standardized, saturated, chisquared.

При использовании этой модели схожести настоятельно рекомендуется не удалять стоп-слова, чтобы получить хорошую релевантность. Также имейте в виду, что термины, частота которых меньше ожидаемой частоты, получат оценку, равную 0.

Имя типа: DFI

Схожесть IB.

Информационная модель . Алгоритм основан на концепции, что информационное содержание в любой последовательности символьного распределения в первую очередь определяется повторяющимся использованием его основных элементов. Для письменных текстов эта задача будет соответствовать сравнению стилей письма разных авторов. Эта модель схожести имеет следующие параметры:

distribution

Возможные значения: ll и spl.

lambda

Возможные значения: df и ttf.

normalization

То же, что и в модели схожести DFR.

Имя типа: IB

Схожесть LM Dirichlet.

Схожесть LM Dirichlet . Эта модель схожести имеет следующие параметры:

mu

По умолчанию 2000.

Формула подсчета баллов в статье присваивает отрицательные баллы терминам, которые имеют меньше вхождений, чем предсказывает языковая модель, что недопустимо для Lucene, поэтому такие термины получают оценку 0.

Имя типа: LMDirichlet

Схожесть LM Jelinek Mercer.

Схожесть LM Jelinek Mercer . Алгоритм пытается захватить важные закономерности в тексте, исключая шум. Эта модель схожести имеет следующие параметры:

lambda

Оптимальное значение зависит как от коллекции, так и от запроса. Оптимальное значение составляет около 0.1 для запросов заголовков и 0.7 для длинных запросов. По умолчанию 0.1. Когда значение приближается к 0, документы, которые соответствуют большему количеству терминов запроса, будут ранжироваться выше, чем те, которые соответствуют меньшему количеству терминов.

Имя типа: 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API