Запрос «Больше похожего на это»
Запрос «Больше похожего на это» находит документы, похожие на заданный набор документов. Для этого 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, все остальные параметры имеют разумные значения по умолчанию. Существует три типа параметров: один для указания входных документов, другой для выбора терминов и для формирования запроса.
Параметры входных документов
| | Единственный обязательный параметр запроса MLT — |
| | Параметр |
| | Список полей для извлечения и анализа текста. По умолчанию используется значение настроек индекса |
Параметры выбора терминов
| | Максимальное количество терминов запроса, которое будет выбрано. Увеличение этого значения повышает точность за счёт скорости выполнения запроса. По умолчанию |
| | Минимальная частота появления термина, ниже которой термины будут игнорироваться из входного документа. По умолчанию |
| | Минимальная частота документа, ниже которой термины будут игнорироваться из входного документа. По умолчанию |
| | Максимальная частота документа, выше которой термины будут игнорироваться из входного документа. Это может быть полезно для игнорирования часто встречающихся слов, таких как стоп-слова. По умолчанию неограничено ( |
| | Минимальная длина слова, ниже которой термины будут игнорироваться. По умолчанию |
| | Максимальная длина слова, выше которой термины будут игнорироваться. По умолчанию неограничено ( |
| | Массив стоп-слов. Любое слово в этом наборе считается «неинтересным» и игнорируется. Если анализатор позволяет использовать стоп-слова, вы можете явно указать MLT на их игнорирование, так как для целей сходства документов кажется разумным предположить, что «стоп-слово никогда не интересно». |
| | Анализатор, используемый для анализа свободного текста. По умолчанию используется анализатор, связанный с первым полем в |
Параметры формирования запроса
| | После формирования дизъюнктивного запроса этот параметр управляет количеством терминов, которые должны совпадать. Синтаксис аналогичен параметру minimum should match. (По умолчанию |
| | Управляет тем, должен ли запрос завершиться ошибкой (выбросить исключение), если какое-либо из указанных полей не имеет поддерживаемого типа ( |
| | Каждый термин в сформированном запросе может быть дополнительно усилен по баллам tf-idf. Это задаёт коэффициент усиления для использования этой функции. По умолчанию выключено ( |
| | Указывает, должны ли входные документы также включаться в результаты поиска. По умолчанию |
| | Задает значение усиления всего запроса. По умолчанию |
Альтернатива
Для более точного контроля над формированием запроса для похожих документов стоит рассмотреть написание пользовательского клиентского кода для сборки отобранных терминов из примера документа в булевый запрос с нужными настройками. Логика в 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