Spec-Zone.ru › Elasticsearch 7
›Elasticsearch Guide [7.17] ›Query DSL ›Специализированные запросы

Запрос «Больше похожего на это»

Запрос «Больше похожего на это» находит документы, похожие на заданный набор документов. Для этого MLT выбирает набор репрезентативных терминов из этих входных документов, формирует запрос с использованием этих терминов, выполняет запрос и возвращает результаты. Пользователь управляет входными документами, способом выбора терминов и формированием запроса.

Простейший случай использования заключается в поиске документов, похожих на предоставленный фрагмент текста. Здесь мы ищем все фильмы, содержащие текст, похожий на «Однажды в сказку», в поле «title» и в поле «description», ограничив количество выбранных терминов 12.

GET /_search
{
  "query": {
    "more_like_this" : {
      "fields" : ["title", "description"],
      "like" : "Once upon a time",
      "min_term_freq" : 1,
      "max_query_terms" : 12
    }
  }
}

Более сложный случай использования заключается в смешении текста с документами, уже существующими в индексе. В этом случае синтаксис указания документа аналогичен синтаксису, используемому в API множественного получения.

GET /_search
{
  "query": {
    "more_like_this": {
      "fields": [ "title", "description" ],
      "like": [
        {
          "_index": "imdb",
          "_id": "1"
        },
        {
          "_index": "imdb",
          "_id": "2"
        },
        "and potentially some more text here as well"
      ],
      "min_term_freq": 1,
      "max_query_terms": 12
    }
  }
}

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

GET /_search
{
  "query": {
    "more_like_this": {
      "fields": [ "name.first", "name.last" ],
      "like": [
        {
          "_index": "marvel",
          "doc": {
            "name": {
              "first": "Ben",
              "last": "Grimm"
            },
            "_doc": "You got no idea what I'd... what I'd give to be invisible."
          }
        },
        {
          "_index": "marvel",
          "_id": "2"
        }
      ],
      "min_term_freq": 1,
      "max_query_terms": 12
    }
  }
}

Как это работает

Предположим, мы хотим найти все документы, похожие на заданный входной документ. Очевидно, что сам входной документ должен быть наилучшим соответствием для этого типа запроса. И причина будет в основном, согласно формуле ранжирования Lucene, из-за терминов с наивысшим tf-idf. Поэтому термины входного документа, имеющие наивысший tf-idf, являются хорошими представителями этого документа и могут быть использованы в дизъюнктивном запросе (или OR), чтобы получить похожие документы. Запрос MLT просто извлекает текст из входного документа, анализирует его, обычно с использованием того же анализатора, что и в поле, а затем выбирает лучшие K терминов с наивысшим tf-idf для формирования дизъюнктивного запроса по этим терминам.

Поля, для которых должен применяться MLT, должны быть проиндексированы и иметь тип text или keyword`. Кроме того, при использовании like с документами, либо _source должен быть включен, либо поля должны быть stored или хранить term_vector. Для ускорения анализа может помочь хранение векторов терминов во время индексирования.

Например, если мы хотим выполнить MLT для полей «title» и «tags.raw», мы можем явно сохранить их term_vector во время индексирования. Мы по-прежнему можем выполнять MLT для полей «description» и «tags», так как _source включен по умолчанию, но ускорения анализа для этих полей не будет.

PUT /imdb
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "term_vector": "yes"
      },
      "description": {
        "type": "text"
      },
      "tags": {
        "type": "text",
        "fields": {
          "raw": {
            "type": "text",
            "analyzer": "keyword",
            "term_vector": "yes"
          }
        }
      }
    }
  }
}

Параметры

Единственный обязательный параметр — like, все остальные параметры имеют разумные значения по умолчанию. Существует три типа параметров: один для указания входных документов, другой для выбора терминов и для формирования запроса.

Параметры входных документов

like

Единственный обязательный параметр запроса MLT — like, и он поддерживает универсальный синтаксис, в котором пользователь может указать свободный текст и/или один или несколько документов (см. примеры выше). Синтаксис указания документов аналогичен синтаксису, используемому в API множественного получения. При указании документов текст извлекается из fields, если не переопределен в каждом запросе документа. Текст анализируется анализатором в поле, но также может быть переопределен. Синтаксис переопределения анализатора в поле аналогичен параметру per_field_analyzer API векторов терминов. Кроме того, для предоставления документов, необязательно присутствующих в индексе, поддерживаются искусственные документы.

unlike

Параметр unlike используется совместно с like, чтобы не выбирать термины, найденные в выбранном наборе документов. Другими словами, мы можем искать документы, like: "Apple", но unlike: "cake crumble tree". Синтаксис такой же, как у like.

fields

Список полей для извлечения и анализа текста. По умолчанию используется значение настроек индекса index.query.default_field, которое имеет значение по умолчанию *. Значение * соответствует всем полям, подходящим для запросов на уровне терминов, за исключением метаданных.

Параметры выбора терминов

max_query_terms

Максимальное количество терминов запроса, которое будет выбрано. Увеличение этого значения повышает точность за счёт скорости выполнения запроса. По умолчанию 25.

min_term_freq

Минимальная частота появления термина, ниже которой термины будут игнорироваться из входного документа. По умолчанию 2.

min_doc_freq

Минимальная частота документа, ниже которой термины будут игнорироваться из входного документа. По умолчанию 5.

max_doc_freq

Максимальная частота документа, выше которой термины будут игнорироваться из входного документа. Это может быть полезно для игнорирования часто встречающихся слов, таких как стоп-слова. По умолчанию неограничено (Integer.MAX_VALUE, что соответствует 2^31-1 или 2147483647).

min_word_length

Минимальная длина слова, ниже которой термины будут игнорироваться. По умолчанию 0.

max_word_length

Максимальная длина слова, выше которой термины будут игнорироваться. По умолчанию неограничено (0).

stop_words

Массив стоп-слов. Любое слово в этом наборе считается «неинтересным» и игнорируется. Если анализатор позволяет использовать стоп-слова, вы можете явно указать MLT на их игнорирование, так как для целей сходства документов кажется разумным предположить, что «стоп-слово никогда не интересно».

analyzer

Анализатор, используемый для анализа свободного текста. По умолчанию используется анализатор, связанный с первым полем в fields.

Параметры формирования запроса

minimum_should_match

После формирования дизъюнктивного запроса этот параметр управляет количеством терминов, которые должны совпадать. Синтаксис аналогичен параметру minimum should match. (По умолчанию "30%").

fail_on_unsupported_field

Управляет тем, должен ли запрос завершиться ошибкой (выбросить исключение), если какое-либо из указанных полей не имеет поддерживаемого типа (text или keyword). Установите это значение в false, чтобы пропустить поле и продолжить обработку. По умолчанию true.

boost_terms

Каждый термин в сформированном запросе может быть дополнительно усилен по баллам tf-idf. Это задаёт коэффициент усиления для использования этой функции. По умолчанию выключено (0). Любое другое положительное значение активирует усиление терминов с заданным коэффициентом усиления.

include

Указывает, должны ли входные документы также включаться в результаты поиска. По умолчанию false.

boost

Задает значение усиления всего запроса. По умолчанию 1.0.

Альтернатива

Для более точного контроля над формированием запроса для похожих документов стоит рассмотреть написание пользовательского клиентского кода для сборки отобранных терминов из примера документа в булевый запрос с нужными настройками. Логика в more_like_this, которая выбирает «интересные» слова из фрагмента текста, также доступна через API векторов терминов. Например, используя API векторов терминов, можно предоставить пользователям выбор ключевых слов, относящихся к теме, найденных в тексте документа, что позволит им выбрать слова, на которых нужно сфокусироваться, вместо более «чёрного ящика» подхода к соответствию, используемого в запросе more_like_this.

© 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/query-dsl-mlt-query.html

Spec-Zone.ru

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