[ S A J A @ 25.05.2021. 03:30 ] @
Zna li neko kako mogu da isključim da znak "-" bude separator kod pretrage? Imam dosta modela pa ako neko ukuca recimo GT-1000 onda mu neće naći. To mi je baš problem. Ne mogu da se načudim koji genije je smislio da "-" bude separator ;)
[ S A J A @ 25.05.2021. 11:14 ] @
Uspeo sam da nađem da se ovo menja u fajlovima koji stoje u folderu /sql/share/charsets.
https://dev.mysql.com/doc/refman/8.0/en/character-arrays.html

Onda se nađe fajl prema charsetu, ja koristim utf8mb4 i collation 0900_ai_ci ali nema takvih fajlova u folderu (?!). Evo šta sve ima:

Directory of D:\Wamp64\bin\mysql\mysql8.0.21\share\charsets

armscii8.xml
ascii.xml
cp1250.xml
cp1251.xml
cp1256.xml
cp1257.xml
cp850.xml
cp852.xml
cp866.xml
dec8.xml
geostd8.xml
greek.xml
hebrew.xml
hp8.xml
Index.xml
keybcs2.xml
koi8r.xml
koi8u.xml
latin1.xml
latin2.xml
latin5.xml
latin7.xml
macce.xml
macroman.xml
README
swe7.xml


Koji je od ovih fajlova za utf?

I kad ga nađem, šta treba da promenim da bih dodao "-" da bude deo reči? Tamo su sve neki brojevi.

Ovde ima primer kako da se doda "&" ali se nigde ne spominje utf8 charset. Tamo piše, "ako imaš charset latin1, onda otvoriš fajl latin1.xml, ubaciš te brojeve, restartuješ i to je to". A šta ako ne koristim latin1 već utf8 za koji ne postoji xml fajl?
https://stackoverflow.com/ques...ampersand-in-fulltext-searches
[ bogdan.kecman @ 25.05.2021. 12:29 ] @
utf kolacije su ubildovane u mysql, moras da napravis svoju novu
kolaciju i dodas svoju kolaciju. imas ovde primer

https://mysql.rs/razno/sortiranje-po-azbuci-azbuka-i-mysql/
[ bogdan.kecman @ 25.05.2021. 12:37 ] @
a sto se tice boolean separatora, ako se ja dobro secam nemaju nikakve veze sa kolacijom vec sa ft_boolean_syntax

Code:

> show global variables like 'ft%';
+--------------------------+----------------+
| Variable_name            | Value          |
+--------------------------+----------------+
| ft_boolean_syntax        | + -><()~*:""&| |
| ft_max_word_len          | 84             |
| ft_min_word_len          | 4              |
| ft_query_expansion_limit | 20             |
| ft_stopword_file         | (built-in)     |
+--------------------------+----------------+
5 rows in set (0.01 sec)


promeni ft_boolean_syntax i rebilduj indekse
[ bogdan.kecman @ 25.05.2021. 13:04 ] @
Citat:
S A J A:
Ne mogu da se načudim koji genije je smislio da "-" bude separator ;)


- je operator od kada je izmisljen, samim tim se podrazumeva da je i separator

Code:

mysql [localhost:8023] {msandbox} (test) > select * from t1 where match(a) against('GT-100' in natural language mode);
+----+--------+
| id | a      |
+----+--------+
|  9 | GT-100 |
+----+--------+
1 row in set (0.00 sec)

mysql [localhost:8023] {msandbox} (test) > select * from t1 where match(a) against('100' in natural language mode);
+----+--------+
| id | a      |
+----+--------+
|  9 | GT-100 |
+----+--------+
1 row in set (0.00 sec)

mysql [localhost:8023] {msandbox} (test) > select * from t1 where match(a) against('-100' in natural language mode);
+----+--------+
| id | a      |
+----+--------+
|  9 | GT-100 |
+----+--------+
1 row in set (0.00 sec)

mysql [localhost:8023] {msandbox} (test) > select * from t1 where match(a) against('-100' in boolean mode);
Empty set (0.00 sec)


[ S A J A @ 25.05.2021. 13:44 ] @
Citat:
bogdan.kecman:
promeni ft_boolean_syntax i rebilduj indekse


Stavio sam SET GLOBAL ft_boolean_syntax = '+ _><()~*:""&|'; (donja crtica umesto minusa)

Upisalo se u show global variables like 'ft%';

Re-indeksirao sam (skroz sklonio indeks i stavio novi)

Međutim, kad probam pretragu MATCH (naslov) AGAINST ('+gt-1000*' IN BOOLEAN MODE) opet ne izlazi

Preko NATURAL MODA radi, ali taj mod je neupotrebljiv jer zahteva da se upiše cela reč. Meni treba pretraga po početku reči, tako je valjda normalno da bude.
[ bogdan.kecman @ 25.05.2021. 14:00 ] @
moja greska, sorry, ft_boolean_syntax nije implementiran za innodb jos uvek :(

Code:

mysql [localhost:8023] {msandbox} (test) > alter table t1 engine=myisam;
Query OK, 14 rows affected (0.04 sec)
Records: 14  Duplicates: 0  Warnings: 0

mysql [localhost:8023] {msandbox} (test) > select * from t1 where match(a) against('+-100*' in boolean mode);
+----+-----------+
| id | a         |
+----+-----------+
|  9 | GT-100    |
| 12 | GT-1000   |
| 13 | GT-10000  |
| 14 | GT-100000 |
+----+-----------+
4 rows in set (0.00 sec)

mysql [localhost:8023] {msandbox} (test) > alter table t1 engine=innodb;
Query OK, 14 rows affected (0.84 sec)
Records: 14  Duplicates: 0  Warnings: 0

mysql [localhost:8023] {msandbox} (test) > select * from t1 where match(a) against('+-100*' in boolean mode);
ERROR 1064 (42000): syntax error, unexpected '-'
mysql [localhost:8023] {msandbox} (test) >


[ bogdan.kecman @ 25.05.2021. 14:03 ] @
odes na https://bugs.mysql.com/bug.php?id=71551 i kliknes na "I'm affected", sto vise ljudi trazi pre ce se implementirati
[ S A J A @ 25.05.2021. 14:31 ] @
Citat:
bogdan.kecman: odes na https://bugs.mysql.com/bug.php?id=71551 i kliknes na "I'm affected", sto vise ljudi trazi pre ce se implementirati


Afektovao sam se ;)

Mada, taj task je otvoren 2014 godine a piše Severity: S2 (Serious). Kako li tek tretiraju neke bezvezne stvari ;)

Dakle, da rezimiramo:

BOOLEAN mod: ne radi pretraga ako reč ima minus ali radi po početku reči (ne mora da se kuca cela reč)
NATURAL mod: radi pretraga ako ima minus u reči ali mora da se ukuca cela reč doslovce (znači kad tražiš nešto, moraš da ukucaš nekoliko puta, jednina, množina, po padežima...)

Drugim rečima, nisu ga baš nešto dobro napravili. Očigledno se taj fulltext search ne koristi nešto mnogo čim je ovako obogaljen.

[ bogdan.kecman @ 25.05.2021. 14:53 ] @
ima ukupno 5 affected usera, ne racuna see to u ozbiljan bag, to sto mu je user stavio S2 ne znaci da mi mislimo da je S2 ... on nije nista vise od "feature request" severity status

FTS see mnogo koristio sa myisam, ali posto je myisam retardiran a innodb ga nije podrzavao dugo 99% ljudi kojima treba FTS su presli na mysql innodb + sphinx http://sphinxsearch.com/ i to radi mega do jaja dobro tako da kada smo mi konacno implementirali fts u innodb to niko ozbiljan ne koristi (bar ja ne znam nijednog paying customera koji to koristi ozbiljno) tako da je ta implementacija ostala tu gde jeste..

inace evo sad gledam, "savet" za tvoj problem je da imas jos jedno "virtualnu" polje koji FTS indexiras umesto originalnog (originalno ne indexiras uopste) a u to "virtualno" polje ubacis string bez tog minusa, tj bez svih specijalnih karaktera i onda radis match po tom polju a radis select originalnog koje koristis ... to radi super kao workaround za ovaj tip problema
[ S A J A @ 25.05.2021. 20:47 ] @
Nije loš ovaj Sphinx mada, realno, baš me mrzi da i njega implementiram. Meni je dovoljan i ovaj obogaljeni FTS ;)

Problem sa minusom sam "rešio" tako što ga konvertujem u donju crtu. Na klijentu uradim string.replaceAll('-','_') a kod čitanja sa servera obrnuto pa bude SELECT id, REPLACE(naslov, '_', '-') as naslov...

Tako da, to lepo funkcioniše, jedino što je budževina pa mi to malo smeta, ali šta da se radi...
[ nkrgovic @ 25.05.2021. 21:28 ] @
A ako imas stvarno donju crtu, onda i nju konvertujes u - iako je orginalno _ ?
[ S A J A @ 25.05.2021. 23:41 ] @
Citat:
nkrgovic: A ako imas stvarno donju crtu, onda i nju konvertujes u - iako je orginalno _ ?


Da, tako je. Ovde se neće koristiti donje crte jer oblast nema veze sa IT-om već sa muzikom. Tu zaista donje crte nemaju šta da traže. Pogotovo u naslovima koji će biti public. Šta više, nisam ni ljubitelj tih donjih crta jer poružnjuju tekst. Sad mi pade ideja da stavim još jedan replace na klijentu. replaceAll('_',' '). Dobra stvar kod Javascripta je što ovi replaceovi mogu da se nanižu jedan za drugim što je prilično zgodno ;)

Mada, sad nešto gledam... moraću još tu karaktera da escapujem. FTS u boolean modu ne radi dobro kad dobije sve ove znake: +, >, <, (, ), ~, *, ". Upravo sam probao. Moraću i to da hendlam...

[Ovu poruku je menjao S A J A dana 26.05.2021. u 00:58 GMT+1]