Spec-Zone.ru › Elasticsearch 8
›Руководство по Elasticsearch [8.17] ›Язык запросов DSL ›Запросы по полному тексту

Запрос Match

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

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

Пример запроса

resp = client.search(
    query={
        "match": {
            "message": {
                "query": "this is a test"
            }
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      match: {
        message: {
          query: 'this is a test'
        }
      }
    }
  }
)
puts response
res, err := es.Search(
	es.Search.WithBody(strings.NewReader(`{
	  "query": {
	    "match": {
	      "message": {
	        "query": "this is a test"
	      }
	    }
	  }
	}`)),
	es.Search.WithPretty(),
)
fmt.Println(res, err)
const response = await client.search({
  query: {
    match: {
      message: {
        query: "this is a test",
      },
    },
  },
});
console.log(response);
GET /_search
{
  "query": {
    "match": {
      "message": {
        "query": "this is a test"
      }
    }
  }
}

Параметры верхнего уровня для match

<field>
(Обязательно, объект) Поле, которое вы хотите искать.

Параметры для <field>

query

(Обязательно) Текст, число, логическое значение или дата, которые вы хотите найти в предоставленном <field>.

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

analyzer
(Необязательно, строка) Анализатор, используемый для преобразования текста в значении query в токены. По умолчанию используется анализатор времени индексирования, настроенный для поля <field>. Если анализатор не настроен, используется анализатор по умолчанию для индекса.
auto_generate_synonyms_phrase_query

(Необязательно, логическое значение) Если true, автоматически создаются запросы match phrase для многословных синонимов. По умолчанию true.

См. Использование синонимов с запросом match для примера.

boost

(Необязательно, число с плавающей точкой) Число с плавающей точкой, используемое для уменьшения или увеличения баллов релевантности запроса. По умолчанию 1.0.

Значения усиления относительны к значению по умолчанию 1.0. Значение усиления между 0 и 1.0 уменьшает релевантность. Значение больше, чем 1.0, увеличивает релевантность.

fuzziness
(Необязательно, строка) Максимальное расстояние редактирования, разрешенное для сопоставления. См. Расширение для допустимых значений и дополнительной информации. См. Расширение в запросе match для примера.
max_expansions
(Необязательно, целое число) Максимальное количество терминов, до которых будет расширяться запрос. По умолчанию 50.
prefix_length
(Необязательно, целое число) Максимальное количество начальных символов, которые остаются неизменными для неточного сопоставления. По умолчанию 0.
fuzzy_transpositions
(Необязательно, логическое значение) Если true, правки для неточного сопоставления включают перестановки двух смежных символов (ab → ba). По умолчанию true.
fuzzy_rewrite

(Необязательно, строка) Метод переписывания запроса. См. rewrite параметр для допустимых значений и дополнительной информации.

Если параметр fuzziness не равен 0, запрос match использует метод fuzzy_rewrite для top_terms_blended_freqs_${max_expansions} по умолчанию.

lenient
(Необязательно, логическое значение) Если true, ошибки, связанные с форматом, такие как предоставление текстового query значения для поля числового типа, игнорируются. По умолчанию false.
operator

(Необязательно, строка) Логика Булевой алгебры, используемая для интерпретации текста в значении query. Допустимые значения:

OR (По умолчанию)
Например, значение query равно capital of Hungary интерпретируется как capital OR of OR Hungary.
AND
Например, значение query равно capital of Hungary интерпретируется как capital AND of AND Hungary.
minimum_should_match

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

zero_terms_query

(Необязательно, строка) Указывает, возвращаются ли документы, если analyzer удаляет все токены, например, при использовании фильтра stop. Допустимые значения:

none (По умолчанию)
Если analyzer удаляет все токены, документы не возвращаются.
all
Возвращает все документы, аналогично запросу match_all.

См. Запрос на нулевые термины для примера.

Заметки

Пример запроса

Вы можете упростить синтаксис запроса соответствия, объединив параметры <field> и query. Например:

resp = client.search(
    query={
        "match": {
            "message": "this is a test"
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      match: {
        message: 'this is a test'
      }
    }
  }
)
puts response
res, err := es.Search(
	es.Search.WithBody(strings.NewReader(`{
	  "query": {
	    "match": {
	      "message": "this is a test"
	    }
	  }
	}`)),
	es.Search.WithPretty(),
)
fmt.Println(res, err)
const response = await client.search({
  query: {
    match: {
      message: "this is a test",
    },
  },
});
console.log(response);
GET /_search
{
  "query": {
    "match": {
      "message": "this is a test"
    }
  }
}

Как работает запрос соответствия

Запрос match имеет тип boolean. Это означает, что предоставленный текст анализируется, и процесс анализа создаёт булеву конструкцию из предоставленного текста. Параметр operator можно установить в or или and для управления булевыми условиями (по умолчанию or). Минимальное количество необязательных should условий для соответствия можно задать с помощью параметра minimum_should_match.

Вот пример с параметром operator:

resp = client.search(
    query={
        "match": {
            "message": {
                "query": "this is a test",
                "operator": "and"
            }
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      match: {
        message: {
          query: 'this is a test',
          operator: 'and'
        }
      }
    }
  }
)
puts response
res, err := es.Search(
	es.Search.WithBody(strings.NewReader(`{
	  "query": {
	    "match": {
	      "message": {
	        "query": "this is a test",
	        "operator": "and"
	      }
	    }
	  }
	}`)),
	es.Search.WithPretty(),
)
fmt.Println(res, err)
const response = await client.search({
  query: {
    match: {
      message: {
        query: "this is a test",
        operator: "and",
      },
    },
  },
});
console.log(response);
GET /_search
{
  "query": {
    "match": {
      "message": {
        "query": "this is a test",
        "operator": "and"
      }
    }
  }
}

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

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

Неточность в запросе соответствия

fuzziness позволяет использовать неточное соответствие, основываясь на типе запрошенного поля. См. Неточность для разрешённых настроек.

В этом случае можно установить параметры prefix_length и max_expansions, чтобы управлять процессом неточности. Если опция неточности установлена, запрос будет использовать top_terms_blended_freqs_${max_expansions} в качестве метода переписывания переписывания запроса. Параметр fuzzy_rewrite позволяет управлять способом переписывания запроса.

Неточные транспозиции (ab → ba) разрешены по умолчанию, но могут быть отключены, установив fuzzy_transpositions в false.

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

resp = client.search(
    query={
        "match": {
            "message": {
                "query": "this is a testt",
                "fuzziness": "AUTO"
            }
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      match: {
        message: {
          query: 'this is a testt',
          fuzziness: 'AUTO'
        }
      }
    }
  }
)
puts response
res, err := es.Search(
	es.Search.WithBody(strings.NewReader(`{
	  "query": {
	    "match": {
	      "message": {
	        "query": "this is a testt",
	        "fuzziness": "AUTO"
	      }
	    }
	  }
	}`)),
	es.Search.WithPretty(),
)
fmt.Println(res, err)
const response = await client.search({
  query: {
    match: {
      message: {
        query: "this is a testt",
        fuzziness: "AUTO",
      },
    },
  },
});
console.log(response);
GET /_search
{
  "query": {
    "match": {
      "message": {
        "query": "this is a testt",
        "fuzziness": "AUTO"
      }
    }
  }
}

Запрос с нулевыми терминами

Если используемый анализатор удаляет все токены в запросе, как фильтр stop, то по умолчанию не будет соответствовать ни одному документу. Чтобы изменить это, можно использовать опцию zero_terms_query, которая принимает значения none (по умолчанию) и all, что соответствует запросу match_all.

resp = client.search(
    query={
        "match": {
            "message": {
                "query": "to be or not to be",
                "operator": "and",
                "zero_terms_query": "all"
            }
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      match: {
        message: {
          query: 'to be or not to be',
          operator: 'and',
          zero_terms_query: 'all'
        }
      }
    }
  }
)
puts response
res, err := es.Search(
	es.Search.WithBody(strings.NewReader(`{
	  "query": {
	    "match": {
	      "message": {
	        "query": "to be or not to be",
	        "operator": "and",
	        "zero_terms_query": "all"
	      }
	    }
	  }
	}`)),
	es.Search.WithPretty(),
)
fmt.Println(res, err)
const response = await client.search({
  query: {
    match: {
      message: {
        query: "to be or not to be",
        operator: "and",
        zero_terms_query: "all",
      },
    },
  },
});
console.log(response);
GET /_search
{
  "query": {
    "match": {
      "message": {
        "query": "to be or not to be",
        "operator": "and",
        "zero_terms_query": "all"
      }
    }
  }
}

Синонимы

Запрос match поддерживает расширение синонимов с несколькими терминами с помощью фильтра токенов synonym_graph. При использовании этого фильтра, парсер создаёт запрос фразы для каждого синонима с несколькими терминами. Например, следующий синоним: "ny, new york" создаст:

(ny OR ("new york"))

Также можно сопоставлять синонимы с несколькими терминами с помощью конъюнкций:

$params = [
    'body' => [
        'query' => [
            'match' => [
                'message' => [
                    'query' => 'ny city',
                    'auto_generate_synonyms_phrase_query' => false,
                ],
            ],
        ],
    ],
];
$response = $client->search($params);
resp = client.search(
    query={
        "match": {
            "message": {
                "query": "ny city",
                "auto_generate_synonyms_phrase_query": False
            }
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      match: {
        message: {
          query: 'ny city',
          auto_generate_synonyms_phrase_query: false
        }
      }
    }
  }
)
puts response
res, err := es.Search(
	es.Search.WithBody(strings.NewReader(`{
	  "query": {
	    "match": {
	      "message": {
	        "query": "ny city",
	        "auto_generate_synonyms_phrase_query": false
	      }
	    }
	  }
	}`)),
	es.Search.WithPretty(),
)
fmt.Println(res, err)
const response = await client.search({
  query: {
    match: {
      message: {
        query: "ny city",
        auto_generate_synonyms_phrase_query: false,
      },
    },
  },
});
console.log(response);
GET /_search
{
   "query": {
       "match" : {
           "message": {
               "query" : "ny city",
               "auto_generate_synonyms_phrase_query" : false
           }
       }
   }
}

Приведённый выше пример создаёт булев запрос:

(ny OR (new AND york)) city

который соответствует документам с термином ny или конъюнкцией new AND york. По умолчанию параметр auto_generate_synonyms_phrase_query устанавливается в true.

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

Spec-Zone.ru

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