Todos os produtos
Search
Central de documentação

AnalyticDB:Busca de texto completo

Última atualização: Aug 24, 2026

Use as funções de índice de texto completo match() against(), match() fuzzy() e match() phrase() para executar buscas de texto completo e destacar as palavras-chave correspondentes nos resultados.

Pré-requisitos

Crie um índice de texto completo. Para obter instruções, consulte Crie um índice de texto completo.

Dados de exemplo

Todos os exemplos neste tópico usam a tabela de exemplo tbl_fulltext_demo. Cada índice de texto completo usa um analisador diferente. Execute as instruções a seguir para criar a tabela e inserir os dados de exemplo.

/* RC_DDL_ENGINE_REWRITE_XUANWUV2=false */
CREATE TABLE `tbl_fulltext_demo` (
  `id` INT,
  `content` VARCHAR,
  `content_alinlp` VARCHAR,
  `content_ik` VARCHAR,
  `content_standard` VARCHAR,
  `content_ngram` VARCHAR,
  FULLTEXT INDEX fidx_c(`content`),  -- Default tokenizer
  FULLTEXT INDEX fidx_alinlp(`content_alinlp`) WITH ANALYZER alinlp,-- AliNLP tokenizer
  FULLTEXT INDEX fidx_ik(`content_ik`) WITH ANALYZER ik,-- IK tokenizer
  FULLTEXT INDEX fidx_standard(`content_standard`) WITH ANALYZER standard,-- Standard tokenizer
  FULLTEXT INDEX fidx_ngram(`content_ngram`) WITH ANALYZER ngram,-- Ngram tokenizer
  PRIMARY KEY (`id`)
) DISTRIBUTED BY HASH(id);

INSERT INTO tbl_fulltext_demo(id, content, content_alinlp, content_ik, content_standard, content_ngram) 
VALUES(1, 'Customers Need Better Products and Services', 'Customers Need Better Products and Services', 'Customers Need Better Products and Services', 'Customers Need Better Products and Services', 'Customers Need Better Products and Services')
,(2, 'Wuhan Changjiang Bridge','Wuhan Changjiang Bridge','Wuhan Changjiang Bridge','Wuhan Changjiang Bridge', 'Wuhan Changjiang Bridge')
,(3, 'Hangzhou, Zhejiang Province','Hangzhou, Zhejiang Province', 'Hangzhou, Zhejiang Province', 'Hangzhou, Zhejiang Province', 'Hangzhou, Zhejiang Province')
,(4, 'User Values and Commercial Values of Products','User Values and Commercial Values of Products', 'User Values and Commercial Values of Products', 'User Values and Commercial Values of Products', 'User Values and Commercial Values of Products');

Observações de uso

  • As funções de índice de texto completo aceitam os caracteres especiais +-&|!(){}[]^"~*?:\/, mas você deve escapá-los com \\.

    Por exemplo, para buscar dados que contenham Spring/Scenery, a instrução incorreta é match(content) against('Spring / Scenery' ) e a correta é match(content) against('Spring \\/ Scenery').

  • As funções de índice de texto completo não aceitam os operadores =, !=, between, is null, is not null ou like.

  • Para dados históricos ou migrados de outros bancos de dados, execute BUILD TABLE tablename force=true após criar o índice de texto completo para que ele entre em vigor. Caso contrário, as consultas MATCH AGAINST retornarão erros. Verifique o status da tarefa BUILD em INFORMATION_SCHEMA.KEPLER_META_BUILD_TASK. O status igual a FINISH indica que a tarefa foi concluída.

Escolha uma função de busca

A busca de texto completo oferece três funções. Selecione a mais adequada ao seu cenário:

Cenário

Função

Corresponder palavras-chave ou frases exatas, com lógica AND, OR e NOT.

MATCH() AGAINST()

Tolerar erros de digitação ou ortografia na entrada e ainda retornar conteúdo próximo à palavra-chave.

MATCH() FUZZY()

Corresponder múltiplas palavras-chave em uma ordem especificada, com um número controlado de deslocamentos entre elas.

MATCH() PHRASE()

MATCH() AGAINST()

A função MATCH() AGAINST() aceita correspondência de palavras e correspondência exata. Ela executa uma busca por palavras-chave nas colunas especificadas e retorna o conteúdo correspondente.

O MATCH() AGAINST() retorna uma pontuação de relevância para cada linha correspondente. Filtre o conjunto de resultados especificando um limiar, como > 0.9. Esse limiar exclui o percentil inferior dos resultados por relevância. Por exemplo, > 0.9 filtra os 90% inferiores por relevância e retorna apenas os 10% superiores. Por padrão, o conjunto de resultados retornado não é ordenado pela pontuação de relevância. Para ordenar os resultados por relevância, use a cláusula ORDER BY.

Sintaxe

SELECT * FROM `table_name` WHERE match (column_name[ , ... ]) against('term')

Parâmetros

  • table_name: a tabela onde a busca será realizada.

  • column_name: a coluna a ser pesquisada. Para buscar em várias colunas, separe os nomes das colunas por vírgulas (,).

  • term: a palavra-chave a ser buscada. Consultas por palavra-chave aceitam os seguintes operadores lógicos:

    • AND: retorna conteúdo que corresponde a todas as palavras-chave.

    • OR: retorna conteúdo que corresponde a qualquer uma das palavras-chave.

    • NOT: retorna conteúdo que corresponde à palavra-chave à esquerda do operador, mas não corresponde à palavra-chave à direita.

Nota

Os operadores lógicos não diferenciam maiúsculas de minúsculas.

Exemplo 1: Consulta em coluna única

SELECT id, content
FROM `tbl_fulltext_demo`
WHERE MATCH (`content`) AGAINST ('Products Services');

O seguinte resultado é retornado:

+------+-----------------------------------------------+
| id   | content                                       |
+------+-----------------------------------------------+
| 4    | User Values and Commercial Values of Products |
+------+-----------------------------------------------+
| 1    | Customers Need Better Products and Services   |
+------+-----------------------------------------------+

Exemplo 2: Consulta em múltiplas colunas

Para corresponder a várias colunas, não é necessário criar um índice composto multicolumna. Desde que cada coluna nas condições possua um índice de texto completo, é possível executar uma consulta de índice de texto completo em múltiplas colunas.

SELECT id, content, content_alinlp
FROM `tbl_fulltext_demo`
WHERE MATCH (content, content_alinlp) AGAINST ('Services');

A consulta a seguir é equivalente. Ela combina as condições por coluna com OR:

SELECT id, content, content_alinlp
FROM `tbl_fulltext_demo`
WHERE MATCH (content) AGAINST ('Services')
OR MATCH (content_alinlp) AGAINST ('Services');

O seguinte resultado é retornado:

+------+---------------------------------------------+---------------------------------------------+
| id   | content                                     | content_alinlp                              |
+------+---------------------------------------------+---------------------------------------------+
| 1    | Customers Need Better Products and Services | Customers Need Better Products and Services |
+------+---------------------------------------------+---------------------------------------------+

Exemplo 3: Consulta booleana

  • Use o operador AND para retornar conteúdo que corresponda a todas as palavras-chave.

SELECT * FROM `tbl_fulltext_demo` WHERE MATCH (content) AGAINST ('Products AND Services');

O seguinte resultado é retornado:

+------+---------------------------------------------+---------------------------------------------+---------------------------------------------+---------------------------------------------+---------------------------------------------+
| id   | content                                     | content_alinlp                              | content_ik                                  | content_standard                            | content_ngram                               |
+------+---------------------------------------------+---------------------------------------------+---------------------------------------------+---------------------------------------------+---------------------------------------------+
|    1 | Customers Need Better Products and Services | Customers Need Better Products and Services | Customers Need Better Products and Services | Customers Need Better Products and Services | Customers Need Better Products and Services |
+------+---------------------------------------------+---------------------------------------------+---------------------------------------------+---------------------------------------------+---------------------------------------------+
  • Use o operador OR para retornar conteúdo que corresponda a qualquer palavra-chave.

SELECT * FROM `tbl_fulltext_demo` WHERE MATCH (content) AGAINST ('Products OR Services');

O seguinte resultado é retornado:

+------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+
| id   | content                                       | content_alinlp                                | content_ik                                    | content_standard                              | content_ngram                                 |
+------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+
|    4 | User Values and Commercial Values of Products | User Values and Commercial Values of Products | User Values and Commercial Values of Products | User Values and Commercial Values of Products | User Values and Commercial Values of Products |
+------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+
|    1 | Customers Need Better Products and Services   | Customers Need Better Products and Services   | Customers Need Better Products and Services   | Customers Need Better Products and Services   | Customers Need Better Products and Services   |
+------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+
  • Use o operador NOT para retornar apenas o conteúdo que corresponde à palavra-chave à esquerda do operador.

SELECT * FROM `tbl_fulltext_demo` WHERE MATCH (content) AGAINST ('Products NOT Services');

O seguinte resultado é retornado:

+------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+
| id   | content                                       | content_alinlp                                | content_ik                                    | content_standard                              | content_ngram                                 |
+------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+
|    4 | User Values and Commercial Values of Products | User Values and Commercial Values of Products | User Values and Commercial Values of Products | User Values and Commercial Values of Products | User Values and Commercial Values of Products |
+------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+
  • Combine o operador NOT com *:* para excluir linhas que correspondem à palavra-chave à direita do operador. Na consulta abaixo, *:* corresponde a todas as linhas da tabela, e a consulta retorna as linhas que não correspondem a Services.

SELECT * FROM `tbl_fulltext_demo` WHERE MATCH (content) AGAINST ('*:* NOT Services');

Use *:* apenas à esquerda de um operador lógico e somente no início da expressão.

O seguinte resultado é retornado:

+------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+
| id   |                    content                    |                content_alinlp                 |                  content_ik                   |               content_standard                |                 content_ngram                 |
+------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+
|    2 |            Wuhan Changjiang Bridge            |            Wuhan Changjiang Bridge            |            Wuhan Changjiang Bridge            |            Wuhan Changjiang Bridge            |            Wuhan Changjiang Bridge            |
+------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+
|    4 | User Values and Commercial Values of Products | User Values and Commercial Values of Products | User Values and Commercial Values of Products | User Values and Commercial Values of Products | User Values and Commercial Values of Products |
+------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+
|    3 |          Hangzhou, Zhejiang Province          |          Hangzhou, Zhejiang Province          |          Hangzhou, Zhejiang Province          |          Hangzhou, Zhejiang Province          |          Hangzhou, Zhejiang Province          |
+------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+
  • Use parênteses para construir uma consulta booleana complexa:

SELECT id, content_alinlp
FROM `tbl_fulltext_demo`
WHERE MATCH (content_alinlp) AGAINST ('(Wuhan OR Hangzhou) AND (Bridge OR Xihu)');

O seguinte resultado é retornado:

+------+-------------------------+
| id   | content_alinlp          |
+------+-------------------------+
|    2 | Wuhan Changjiang Bridge |
+------+-------------------------+

Exemplo 4: Filtragem de conjunto de resultados

Uma busca de texto completo retorna todos os resultados semelhantes à palavra-chave. Quando o volume de dados é grande, o conjunto de resultados de uma consulta por palavra-chave também é extenso, mas frequentemente você precisa apenas dos resultados com alta relevância. Por isso, o AnalyticDB for MySQL oferece filtragem de conjunto de resultados.

O exemplo a seguir filtra os 90% inferiores por relevância e retorna apenas os 10% superiores.

SELECT id, content
FROM `tbl_fulltext_demo`
WHERE MATCH (content) AGAINST ('Products Services') > 0.9;

O seguinte resultado é retornado:

+------+-----------------------------------------------+
| id   | content                                       |
+------+-----------------------------------------------+
|    4 | User Values and Commercial Values of Products |
+------+-----------------------------------------------+
|    1 | Customers Need Better Products and Services   |
+------+-----------------------------------------------+

Exemplo 5: Pontuações de relevância e ordenação

O AnalyticDB for MySQL pode retornar as pontuações de relevância de um conjunto de resultados e ordenar os resultados por essa pontuação.

  • Consulte as pontuações de relevância.

SELECT id, content, MATCH (content) AGAINST ('Products Services') AS score
FROM `tbl_fulltext_demo`
WHERE MATCH (content) AGAINST ('Products Services') > 0.9;
Importante

A condição WHERE MATCH(content) AGAINST('Products Services') > 0.9 filtra 90% dos resultados de baixa relevância e retorna apenas os 10% superiores por pontuação de relevância.

Por padrão, o conjunto de resultados retornado não é ordenado pela pontuação de relevância:

+------+-----------------------------------------------+----------------------+
| id   | content                                       | score                |
+------+-----------------------------------------------+----------------------+
|    4 | User Values and Commercial Values of Products | 0.13076457381248474  |
+------+-----------------------------------------------+----------------------+
|    1 | Customers Need Better Products and Services   | 1.1090354919433594   |
+------+-----------------------------------------------+----------------------+

A expressão MATCH(content) AGAINST ('Wuhan') na projeção SELECT não precisa corresponder à expressão MATCH(content) AGAINST ('Products Services') na cláusula WHERE. A instrução de consulta a seguir retorna as pontuações de relevância para MATCH(content) AGAINST ('Wuhan').

SELECT *, MATCH (content) AGAINST ('Wuhan') AS score
FROM `tbl_fulltext_demo`
WHERE MATCH (content) AGAINST ('Products Services') > 0.9
ORDER BY score DESC;

O seguinte resultado é retornado:

+------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+-------+
| id   | content                                       | content_alinlp                                | content_ik                                    | content_standard                              | content_ngram                                 | score |
+------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+-------+
|    4 | User Values and Commercial Values of Products | User Values and Commercial Values of Products | User Values and Commercial Values of Products | User Values and Commercial Values of Products | User Values and Commercial Values of Products | 0.0   |
+------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+-------+
|    1 | Customers Need Better Products and Services   | Customers Need Better Products and Services   | Customers Need Better Products and Services   | Customers Need Better Products and Services   | Customers Need Better Products and Services   | 0.0   |
+------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+-----------------------------------------------+-------+
  • Ordene por relevância.

    Use a cláusula ORDER BY para classificar os resultados por pontuação de relevância em ordem decrescente.

SELECT id, content, MATCH (content) AGAINST ('Products Services') AS score
FROM `tbl_fulltext_demo`
WHERE MATCH (content) AGAINST ('Products Services') > 0.9
ORDER BY score DESC;
Importante

A condição WHERE MATCH(content) AGAINST('Products Services') > 0.9 filtra 90% dos resultados de baixa relevância e retorna apenas os 10% superiores por pontuação de relevância.

O seguinte resultado é retornado:

+------+-----------------------------------------------+---------------------+
| id   | content                                       | score               |
+------+-----------------------------------------------+---------------------+
|    1 | Customers Need Better Products and Services   | 0.2615291476249695  |
+------+-----------------------------------------------+---------------------+
|    4 | User Values and Commercial Values of Products | 0.13076457381248474 |
+------+-----------------------------------------------+---------------------+

Exemplo 6: Correspondência de palavras

Por padrão, uma busca de texto completo primeiro tokeniza a palavra-chave e depois executa a pesquisa. Se você não colocar a palavra-chave entre aspas duplas, uma linha será retornada quando corresponder a qualquer uma das palavras-chave tokenizadas.

O analisador AliNLP divide Products and Services em Products, and e Services, e divide Products Services em Products e Services.

SELECT id, content_alinlp, MATCH (content_alinlp) AGAINST ('Products Services') AS score
FROM `tbl_fulltext_demo`
WHERE MATCH (content_alinlp) AGAINST ('Products Services') > 0.9
ORDER BY score DESC;
Importante

A condição WHERE MATCH(content) AGAINST('Products Services') > 0.9 filtra 90% dos resultados de baixa relevância e retorna apenas os 10% superiores por pontuação de relevância.

Uma linha é retornada quando corresponde a qualquer uma das palavras-chave em Products Services:

+------+-----------------------------------------------+---------------------+
| id   | content_alinlp                                | score               |
+------+-----------------------------------------------+---------------------+
|    1 | Customers Need Better Products and Services   | 0.2615291476249695  |
+------+-----------------------------------------------+---------------------+
|    4 | User Values and Commercial Values of Products | 0.13076457381248474 |
+------+-----------------------------------------------+---------------------+

Exemplo 7: Correspondência exata

Se você colocar a palavra-chave entre aspas duplas, o analisador não dividirá a palavra-chave. Uma linha será retornada somente quando os dados na coluna especificada corresponderem exatamente à palavra-chave entre aspas.

  • Busque conteúdo que corresponda exatamente à palavra-chave Products Services.

SELECT id, content_alinlp, MATCH (content_alinlp) AGAINST ('"Products Services"') AS score
FROM `tbl_fulltext_demo`
WHERE MATCH (content_alinlp) AGAINST ('"Products Services"') > 0.9
ORDER BY score DESC;

A correspondência exata para a palavra-chave Products Services retorna um resultado vazio:

Empty set
  • Busque conteúdo que corresponda exatamente à palavra-chave Products and Services.

SELECT id, content_alinlp, MATCH (content_alinlp) AGAINST ('"Products and Services"') AS score
FROM `tbl_fulltext_demo`
WHERE MATCH (content_alinlp) AGAINST ('"Products and Services"') > 0.9
ORDER BY score DESC;
Importante

A condição WHERE MATCH(content) AGAINST('Products Services') > 0.9 filtra 90% dos resultados de baixa relevância e retorna apenas os 10% superiores por pontuação de relevância.

O seguinte resultado é retornado:

+------+---------------------------------------------+--------------------+
| id   | content_alinlp                              | score              |
+------+---------------------------------------------+--------------------+
|    1 | Customers Need Better Products and Services | 0.3922937512397766 |
+------+---------------------------------------------+--------------------+

MATCH() FUZZY()

A função MATCH() FUZZY() aceita consultas de correspondência aproximada. Ela compara o texto pesquisado com base na Distância de Edição de Levenshtein. Se a entrada contiver erros, uma consulta de correspondência aproximada ainda poderá retornar conteúdo próximo à palavra-chave.

Sintaxe

SELECT * FROM `table_name` WHERE match (`column_name`) fuzzy('term') [max_edits(n)];

Parâmetros

  • table_name: a tabela onde a busca será realizada.

  • column_name: a coluna a ser pesquisada.

  • term: a palavra-chave a ser buscada.

  • max_edits(n): a distância máxima de edição (opcional), que representa o número mínimo de alterações (inserções, exclusões ou substituições) necessárias para transformar a string A na string B. Valor padrão: 2. Valores válidos: inteiros de 0 a 2. Por exemplo, uma alteração transforma windos em windows ao inserir o caractere w; portanto, a distância máxima de edição entre windos e windows é 1.

Exemplo 1: Consulta aproximada

SELECT id, content
FROM tbl_fulltext_demo
WHERE MATCH(content_standard) FUZZY('hangzou');

Se você não especificar max_edits, a distância máxima de edição assume o valor padrão 2. A palavra-chave com erro ortográfico hangzou ainda corresponde a Hangzhou. O seguinte resultado é retornado:

+------+-----------------------------+
| id   | content                     |
+------+-----------------------------+
|    3 | Hangzhou, Zhejiang Province |
+------+-----------------------------+

Para limitar a distância máxima de edição a 1, adicione a cláusula max_edits(1):

SELECT id, content
FROM tbl_fulltext_demo
WHERE MATCH(content_standard) FUZZY('hangzou') max_edits(1);

O seguinte resultado é retornado:

+------+-----------------------------+
| id   | content                     |
+------+-----------------------------+
|    3 | Hangzhou, Zhejiang Province |
+------+-----------------------------+

Exemplo 2: Consulta aproximada com distância de edição 2

SELECT id, content
FROM tbl_fulltext_demo
WHERE MATCH(content_standard) FUZZY('Wuhan Chang') max_edits(2);

O seguinte resultado é retornado:

+------+-------------------------+
| id   | content                 |
+------+-------------------------+
|    2 | Wuhan Changjiang Bridge |
+------+-------------------------+

MATCH() PHRASE()

A função MATCH() PHRASE() aceita consultas de frase. Ela pesquisa na coluna especificada por conteúdo que corresponda a múltiplas palavras-chave. Quando todas as palavras-chave correspondem, use o parâmetro slop como condição adicional para determinar se a consulta de frase é satisfeita.

Sintaxe

SELECT * FROM `table_name` WHERE match (`column_name`) phrase('term1 term2') [slop(n)]

Parâmetros

  • table_name: a tabela onde a busca será realizada.

  • column_name: a coluna a ser pesquisada.

  • term1 term2: a lista de palavras-chave a serem buscadas. Separe as palavras-chave com espaços. A ordem das palavras-chave afeta os resultados da correspondência.

  • slop(n): o número máximo de deslocamentos (opcional). Após o analisador dividir o texto em uma lista de termos, cada termo é numerado em ordem começando de 0. Os termos são deslocados para a esquerda ou direita para corresponder à lista de palavras-chave especificada pelo parâmetro phrase. Valor padrão: 0. Valores válidos: inteiros de 0 a 6. Por exemplo, o analisador Standard divide Need Better Products and Services em Need, Better, Products, and e Services.

Texto

Need

Better

Products

and

Services

Posição

0

1

2

3

4

  • phrase('Need Products'): a distância slop é 1, o que significa que Need se desloca uma posição para a direita ou Products se desloca uma posição para a esquerda.

  • phrase('Need and'): a distância slop é 2, o que significa que Need se desloca duas posições para a direita ou and se desloca duas posições para a esquerda.

Exemplo 1: Consulta de frase em inglês

O AnalyticDB for MySQL usa o analisador Standard integrado, que divide Hangzhou, Zhejiang Province em Hangzhou, Zhejiang e Province nas configurações padrão.

  • Busque conteúdo que corresponda às palavras-chave zhejiang hangzhou.

SELECT id, content
FROM tbl_fulltext_demo
WHERE MATCH(content_standard) PHRASE('zhejiang hangzhou');

O parâmetro slop é 0 por padrão, portanto, a busca por conteúdo que corresponda às palavras-chave zhejiang hangzhou retorna um resultado vazio:

Empty set
  • Busque conteúdo que corresponda às palavras-chave hangzhou Province após um deslocamento.

SELECT id, content
FROM tbl_fulltext_demo
WHERE MATCH(content_standard) PHRASE('hangzhou Province') slop(1);

O seguinte resultado é retornado:

+------+-----------------------------+
| id   | content                     |
+------+-----------------------------+
|    3 | Hangzhou, Zhejiang Province |
+------+-----------------------------+
  • Busque conteúdo que corresponda às palavras-chave zhejiang hangzhou após dois deslocamentos.

SELECT id, content
FROM tbl_fulltext_demo
WHERE MATCH(content_standard) PHRASE('zhejiang hangzhou') slop(2);

O seguinte resultado é retornado:

+------+-----------------------------+
| id   | content                     |
+------+-----------------------------+
|    3 | Hangzhou, Zhejiang Province |
+------+-----------------------------+

Exemplo 2: Consulta de frase com os analisadores IK e Standard

Em cenários de correspondência de frases em chinês que usam MATCH() PHRASE(), os analisadores integrados AliNLP e Ngram podem falhar em corresponder aos dados consultados. Use o analisador Standard ou o analisador IK como alternativa.

  • Busque conteúdo que corresponda às palavras-chave Products Services após um deslocamento.

SELECT id, content
FROM tbl_fulltext_demo
WHERE MATCH(content_ik) PHRASE('Products Services') slop(1);

O seguinte resultado é retornado:

+------+---------------------------------------------+
| id   | content                                     |
+------+---------------------------------------------+
|    1 | Customers Need Better Products and Services |
+------+---------------------------------------------+
  • Busque conteúdo que corresponda às palavras-chave Products Services após dois deslocamentos.

SELECT id, content
FROM tbl_fulltext_demo
WHERE MATCH(content_standard) PHRASE('Products Services') slop(2);

O seguinte resultado é retornado:

+------+---------------------------------------------+
| id   | content                                     |
+------+---------------------------------------------+
|    1 | Customers Need Better Products and Services |
+------+---------------------------------------------+

Suporte a destaque

Destaque usando uma função

O AnalyticDB for MySQL aceita a função fulltext_highlight(column_name), que destaca as palavras-chave correspondentes em uma coluna de índice de texto completo.

Exemplo 1: Destacar palavras-chave de MATCH() AGAINST()

  • Destaque palavras-chave em uma consulta de coluna única.

SELECT MATCH (content_alinlp) AGAINST ('Wuhan Changjiang') AS score, fulltext_highlight(content_alinlp)
FROM tbl_fulltext_demo
WHERE MATCH (content_alinlp) AGAINST ('Wuhan Changjiang') > 0.9
ORDER BY score DESC LIMIT 3;
Importante

A condição WHERE MATCH(content_alinlp) AGAINST('Wuhan Changjiang') > 0.9 filtra 90% dos resultados de baixa relevância e retorna apenas os 10% superiores por pontuação de relevância.

O seguinte resultado é retornado:

+--------------------+-------------------------------------------+
| score              | fulltext_highlight(content_alinlp)        |
+--------------------+-------------------------------------------+
| 0.2615291476249695 | <em>Wuhan</em> <em>Changjiang</em> Bridge |
+--------------------+-------------------------------------------+
  • Destaque palavras-chave em uma consulta de múltiplas colunas.

SELECT MATCH (content_alinlp) AGAINST ('Wuhan Changjiang') AS score, fulltext_highlight(content_alinlp)
FROM tbl_fulltext_demo
WHERE MATCH (content_alinlp) AGAINST ('Wuhan Changjiang') > 0.9
AND MATCH (content_alinlp) AGAINST ('Bridge') > 0.9
ORDER BY score DESC LIMIT 3;
Importante

A condição WHERE MATCH(content_alinlp) AGAINST('Wuhan Changjiang') > 0.9 filtra 90% dos resultados de baixa relevância e retorna apenas os 10% superiores por pontuação de relevância.

O seguinte resultado é retornado:

+--------------------+----------------------------------------------------+
| score              | fulltext_highlight(content_alinlp)                 |
+--------------------+----------------------------------------------------+
| 0.2615291476249695 | <em>Wuhan</em> <em>Changjiang</em> <em>Bridge</em> |
+--------------------+----------------------------------------------------+

Exemplo 2: Destacar palavras-chave de MATCH() FUZZY()

SELECT id, MATCH(content_standard) FUZZY('Wuhan Chang') as score, fulltext_highlight(content_standard)
FROM tbl_fulltext_demo
WHERE MATCH(content_standard) FUZZY('Wuhan Chang');

O seguinte resultado é retornado:

+------+-------+-------------------------------------------+
| id   | score | fulltext_highlight(content_standard)      |
+------+-------+-------------------------------------------+
|    2 |   0.0 | <em>Wuhan</em> Chang<em>jiang</em> Bridge |
+------+-------+-------------------------------------------+

Exemplo 3: Destacar palavras-chave de MATCH() PHRASE()

SELECT id, MATCH(content_ik) PHRASE('Products Services') slop(1) as score, fulltext_highlight(content_ik)
FROM tbl_fulltext_demo
WHERE MATCH(content_ik) PHRASE('Products Services') slop(1);

O seguinte resultado é retornado:

+------+---------------------+---------------------------------------------------------------+
| id   | score               | fulltext_highlight(content_ik)                                |
+------+---------------------+---------------------------------------------------------------+
|    1 | 0.16922473907470703 | Customers Need Better <em>Products</em> and <em>Services</em> |
+------+---------------------+---------------------------------------------------------------+

Personalizar o destaque usando uma dica

O AnalyticDB for MySQL destaca os resultados da busca de texto completo com as tags <em> e </em> por padrão. Também é possível usar uma dica para definir fulltext_highlight_pre_tag e fulltext_highlight_post_tag, especificando as tags de destaque à esquerda e à direita.

Os exemplos a seguir usam <span> e </span> como tags de destaque.

Exemplo 4: Destaque personalizado para MATCH() AGAINST()

/*+ fulltext_highlight_pre_tag=<span>,fulltext_highlight_post_tag=</span>*/
SELECT MATCH (content_alinlp) AGAINST ('Wuhan Changjiang') AS score, fulltext_highlight(content_alinlp)
FROM tbl_fulltext_demo
WHERE MATCH (content_alinlp) AGAINST ('Wuhan Changjiang') > 0.9
ORDER BY score DESC LIMIT 3;
Importante

A condição WHERE MATCH(content_alinlp) AGAINST('Wuhan Changjiang') > 0.9 filtra 90% dos resultados de baixa relevância e retorna apenas os 10% superiores por pontuação de relevância.

O seguinte resultado é retornado:

+--------------------+---------------------------------------------------+
| score              | fulltext_highlight(content_alinlp)                |
+--------------------+---------------------------------------------------+
| 0.2615291476249695 | <span>Wuhan</span> <span>Changjiang</span> Bridge |
+--------------------+---------------------------------------------------+

Exemplo 5: Destaque personalizado para MATCH() FUZZY()

/*+ fulltext_highlight_pre_tag=<span>,fulltext_highlight_post_tag=</span>*/
SELECT MATCH (content_alinlp) FUZZY ('Wuhan Changjiang') AS score, fulltext_highlight(content_alinlp)
FROM tbl_fulltext_demo
WHERE MATCH (content_alinlp) FUZZY ('Wuhan Changjiang') > 0.9
ORDER BY score DESC LIMIT 3;
Importante

A condição WHERE MATCH(content_alinlp) FUZZY('Wuhan Changjiang') > 0.9 filtra 90% dos resultados de baixa relevância e retorna apenas os 10% superiores por pontuação de relevância.

O seguinte resultado é retornado:

+--------------------+---------------------------------------------------+
| score              | fulltext_highlight(content_alinlp)                |
+--------------------+---------------------------------------------------+
| 0.0                | <span>Wuhan</span> <span>Changjiang</span> Bridge |
+--------------------+---------------------------------------------------+

Exemplo 6: Destaque personalizado para MATCH() PHRASE()

/*+ fulltext_highlight_pre_tag=<span>,fulltext_highlight_post_tag=</span>*/
SELECT MATCH (content_alinlp) PHRASE ('Wuhan') AS score, fulltext_highlight(content_alinlp)
FROM tbl_fulltext_demo
WHERE MATCH (content_alinlp) PHRASE ('Wuhan') > 0.9
ORDER BY score DESC LIMIT 3;
Importante

A condição WHERE MATCH(content_alinlp) PHRASE('Wuhan') > 0.9 filtra 90% dos resultados de baixa relevância e retorna apenas os 10% superiores por pontuação de relevância.

O seguinte resultado é retornado:

+---------------------+-----------------------------------------------------------------------------------+
| score               | fulltext_highlight(content_alinlp)                                                |
+---------------------+-----------------------------------------------------------------------------------+
| 0.13076457381248474 | Customers Need Better <span>Products</span> <span>and</span> <span>Services</span> |
+---------------------+-----------------------------------------------------------------------------------+