Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

376
Views
MySQL MATCH() AGAINST() FULLTEXT Index - Lograr una coincidencia de cadena parcial combinada con una coincidencia de frase

Tengo una tabla con contenido de columna que tiene un índice FULLTEXT .

Quiero aprovechar la velocidad de MATCH() en texto grande.

Quiero que la búsqueda sea lo más precisa posible.

Cuando busco la cadena de frases " camión grande " de esta manera:

 SELECT * FROM MyTable WHERE MATCH(content) AGAINST('"large truck"' IN BOOLEAN MODE);

Se pierden algunos casos.

Mi mesa:

 | content | ---------------- |Large \n truck| FOUND ✓ ---------------- |large truck | FOUND ✓ ---------------- |large trucks | *PLURAL MISSED! ---------------- |large truckl | *TYPE-O MISSED!

Si uso el método estándar LIKE / wildcard :

 SELECT * FROM `MyTable` WHERE `content` LIKE '%large truck%'

Mi mesa:

 | content | ---------------- |Large \n truck| *MISSED! ---------------- |large truck | FOUND ✓ ---------------- |large trucks | FOUND ✓ ---------------- |large truckl | FOUND ✓

Parece que tampoco puedo usar una búsqueda de FRASES con comodines:

 SELECT * FROM MyTable WHERE MATCH(content) AGAINST('"large truck*"' IN BOOLEAN MODE); **DOES NOT WORK**

O

 SELECT * FROM MyTable WHERE MATCH(content) AGAINST('"large truck"*' IN BOOLEAN MODE); **DOES NOT WORK**

Asi que...

¿Cómo uso con éxito MATCH() AGAINST() buscando una frase y obtengo todas las instancias devueltas, incluso coincidencias de cadenas parciales que no distinguen entre mayúsculas y minúsculas?

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

El truco que suelo usar con FT es hacerlo en dos pasos:

  1. Haga un MATCH , con la esperanza de obtener todo el texto deseado, pero posiblemente algunos resultados adicionales.
  2. AND con otra condición: LIKE (más rápido) o REGEXP (más potente).

El MATCH será rápido gracias a FT; la otra parte se realizará en segundo lugar, por lo que será rápido porque no hay muchas filas para verificar.

Esto coincide con sus criterios:

 SELECT * FROM MyTable WHERE MATCH(content) AGAINST('+large +truck*' IN BOOLEAN MODE) AND content REGEXP "large[[:space:]]+truck";

Dicho de otra manera, la consulta se ejecutará de la siguiente manera:

  1. Digamos que la tabla tiene 10K filas.
  2. Se evaluará la expresión FT. El MATCH será muy rápido (por la forma en que está diseñado). Encontrará todas las filas con "grande" y "camión*" en cualquier parte del content . Ahora, digamos, hay 30 filas que satisfacen eso.
  3. El resto del WHERE se evalúa. Pero se hace contra solo esas 30 filas. Entonces, aunque el REGEXP es costoso, no se realiza con frecuencia.
  4. Entonces quizás se devuelvan 14 filas.

El efecto neto es que toda la consulta se ejecuta "rápido", que era uno de sus requisitos.

Nota: necesitaba la segunda parte para evitar estos

 large green truck the truck is large

Dependiendo de la versión, es posible que necesite este REGEXP en su lugar: "large\\s+truck" .

over 4 years ago · Santiago Trujillo Report

0

Aquí hay un truco rápido con REGEXP, pero no está resolviendo el problema ya que no usa el índice de texto completo:

 SELECT * FROM MyTable WHERE content REGEXP("large[[:space:]]+truck*");

Por supuesto, también puede utilizar el índice FT buscando sin frase exacta:

 SELECT * FROM MyTable WHERE MATCH(content) AGAINST('+large +truck*' IN BOOLEAN MODE);

Pero esto eventualmente incluirá registros que no desea, ya que no es lo mismo que la búsqueda de frases exactas.

Desafortunadamente, la búsqueda de frases (comillas dobles - "") y el operador de truncamiento (comodín - *) no funcionarán independientemente de si usa InnoDB o MyISAM. Tampoco funciona con el operador de distancia con InnoDB (que probablemente provenga del mismo origen). Supongo que está relacionado con la naturaleza de cómo se almacenan los datos del índice de texto completo.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!