MySQL trata texto completo de la palabra en un texto e-magazine
como frase y no como una palabra. Por eso resulta el dos palabras e
y magazine
. Y mientras construye el índice de búsqueda, no agrega el e
al índice debido al ft_min_word_len
(el valor predeterminado es 4 caracteres).
La misma limitación de longitud se utiliza para la consulta de búsqueda. Ese es el motivo por el que una búsqueda de e-magazine
devuelve exactamente los mismos resultados que a-magazine
porque a
y -
se ignoran por completo.
Pero ahora usted quiere encontrar la frase exacta e-magazine
.Por que utilice las comillas y que es la forma correcta completa para encontrar frases, pero MySQL no soporta los operadores de frases, sólo para decir:
https://dev.mysql.com/doc/refman/5.7/en/fulltext-boolean.html
Con este modificador, ciertos caracteres tienen un significado especial en el principio o al final de las palabras en la cadena de búsqueda
Algunas personas sugieren utilizar la siguiente consulta:
SELECT id, name
FROM company
WHERE MATCH(name) AGAINST('e-magazi*' IN BOOLEAN MODE)
HAVING name LIKE 'e-magazi%';
Como dije, MySQL ignora el e-
y busca la palabra comodín magazi*
. Después de que se obtengan esos resultados, utiliza HAVING
para filtrar los resultados de e-magazi*
, incluido el e-
. Con eso encontrarás la frase e-magazine AG
. Por supuesto, solo se necesita HAVING
si la frase de búsqueda contiene el operador comodín y nunca debe usar comillas. ¡Este operador es utilizado por su usuario y no usted!
Nota: Siempre que no rodee la frase de búsqueda con %
encontrará solo los campos que comienzan con esa palabra. Y no quiere rodearlo, porque también encontrará bee-magazine
. Entonces tal vez necesites un OR HAVING name LIKE ' %e-magazi%' OR HAVING NAME LIKE '\\n%e-magazi%'
adicional para hacerlo utilizable dentro de los textos.
truco
Pero, finalmente, yo prefiero un truco tan HAVING
no es necesaria en absoluto:
- Si agrega textos a su tabla de base de datos, añadir, además, a una columna de texto completo separado indexados y reemplace palabras como
up-to-date
con up-to-date uptodate
.
- Si un usuario busca
up-to-date
, reemplácelo en la consulta con uptodate
.
Por que aún se pueden encontrar en specific
user-specific
pero up-to-date
así (y no sólo date
).
Bono
Si un usuario busca -well-known huge ports
MySQL trata como not include *well*, could include *known* and *huge*
. Por supuesto que podría resolver ese otro con una variante de consulta adicional, así, pero con el truco anterior se retire el guión por lo que la consulta de búsqueda se ve simplemente como eso:
SELECT id
FROM texts
WHERE MATCH(text) AGAINST('-wellknown huge ports' IN BOOLEAN MODE)
pregunta interesante. Puedo replicarlo aquí en una tabla con un campo similar a uuid. 'SELECT id, bootid FROM socket WHERE MATCH (bootid) CONTRA ('+" 18bda775 "' EN MODO BOOLEANO);' funcionará y también lo hará si busco "18bda775-711c", pero busco "18bda" o "18bda775" -711 "no funcionará. el campo 'bootid' en cuestión contiene: 18bda775-711c-4329-9de2-a3d81dc13d06 –
También tratamos de cambiar los caracteres de control booleanos para usar # en lugar de - pero no tuvo efecto (sí, repare el índice de la tabla después del cambio) : 'ft_boolean_syntax = + #><() ~ *:" "& |' – hajo