Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
David Hartinger
Vlastník
Avatar
David Hartinger:5.3.2015 11:18

Snažili jsme se napsal vlastní fulltextové vyhledávání v článcích (pomocí MATCH AGAINS), nicméně jsme rychle zjistili, že to není tak jednoduché, jak by se mohlo zdát. Kromě toho, že jsou výsledky dosti chabé (oproti Google vlastnímu hledání :D ), rád bych se zeptal na 2 věci.

Když uživatel zadá např. "pole php", uděláme ze vstupu frázi ve tvaru "+pole* +php*". Problém je, že když zadá "c++ pole", MySQL bere plus jako řídící znak. V jejich manuálu (smrt Oracle) se mi nepodařilo nikde najít jak to odescapovat.

Nepochopil jsem jak funguje relevance. Ve většině výsledků vrátí MATCH ... AGAINST číslo 1, 2 nebo nějakou šílenost typu (9.151561651651).

V poslední řadě by mě zajímalo, jak se řeší náhledy vyhledávání (ukázka hledané fráze v okolním textu článku). Pomocí funkcí pro práci s řetězci nalezneme hledanou frází a vybereme 50 znaků okolo ní. Samozřejmě toto funguje jen pro jedno slovo, když jsou 2, vybere to jen první. Říkám si, že tahat celé články a parsovat je v PHP za účelem tvorby náhledů frází bude výkonově dost náročné, asi to ale jinak nepůjde.

V poslední řadě bych se rád zeptal, zda neexistuje nějaká hotová knihovna nebo prostě jak toto řešíte.

Jo a ještě nějaký ten kód, část s články:

SELECT title,
(CASE
        WHEN (LOCATE(?, content) > 0) THEN
                -- nalezeno v clanku
                (CASE
                        WHEN ((LOCATE(?, content) - 50) < 1) THEN
                                SUBSTRING(content, 1, LENGTH(?) + 100)
                        ELSE
                                CONCAT("...", SUBSTRING(content, LOCATE(?, content) - 50, LENGTH(?) + 100))
                END)
        ELSE -- nalezeno v popisku
                description
END) AS description
, url, CONCAT("images/", uniqid, "_image_0_thumb.png") AS image, has_image, ? AS phrase,
(MATCH (title) AGAINST (? IN BOOLEAN MODE) + 100) AS title_relevance,
(MATCH (title, description, content) AGAINST (? IN BOOLEAN MODE)) + 100 AS relevance
FROM article
WHERE MATCH (title, description, content) AGAINST (? IN BOOLEAN MODE)
ORDER BY title_relevance DESC, relevance DESC
Odpovědět
5.3.2015 11:18
You are the greatest project you will ever work on.
Avatar
shaman
Člen
Avatar
Odpovídá na David Hartinger
shaman:5.3.2015 17:18

Pokial sa nemylim tak multislovne vyhladavanie nemusis davat osobitne s + ale das do zatvoriek, takze

WHERE MATCH (title, description, content) AGAINST ( '+(php pole) -(mysql)' IN BOOLEAN MODE)

vrati texty s 'php' a 'pole' ale nesmie obsahovat 'mysql'.

Relevancia funguje tak, ze ak hladas napr 'php' a najde ti 500 textov, tak nema velku relevanciu, neni takzvane unikatne a tieto vysledky budu mat nizsiu relevanciu. Ak slovo 'pole' najde len 10krat tak ma o dost vacsiu relevanciu a texty s tymto slovom ziskaju vyssie score. Skore moze byt od nula do jedna, ale videl som uz aj nad 1.

Pre vytvorenie ukazky obal slovo 5 slovami pred aj po. Ak je viac slov a je medzi nimi viac slov tak tam hod 3 bodky. Urcite by som nedaval v ukazke viac ako 20 slov.

Ak najdes nejaku kniznicu, daj vediet. Rad si pozriem riesenia. Pred casom som riesil stranku s 25000 produktami. Tam sme si to exportovali cronom kazdy den do SOLR a potom solr je uzasne vykonne na taketo fulltext hladania.

Nahoru Odpovědět
5.3.2015 17:18
try {...} catch (Exception ignored) { echo " ¯\_(ツ)_/¯ "; }
Avatar
shaman
Člen
Avatar
Odpovídá na David Hartinger
shaman:5.3.2015 17:30

este som tam nasiel

“”  Defines a phrase (as opposed to a list of individual words, the entire phrase is matched for inclusion or exclusion).

vyskusaj to dat do tychto uvodzoviek a pred uvodzovky daj +

Editováno 5.3.2015 17:30
Nahoru Odpovědět
5.3.2015 17:30
try {...} catch (Exception ignored) { echo " ¯\_(ツ)_/¯ "; }
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na shaman
David Hartinger:6.3.2015 13:08

Ahoj, díky za reakci. Zkusil jsem to, bohužel jsem se nedobral žádných výsledků.

$phrase = '+"C++"*'

to nebere vůbec. Když zadám:

$phrase = '"C++"'

Tak to sežere, ale nic to nevyhledá. Našel jsem ještě topic na stacku - http://stackoverflow.com/…p-the-term-c, mění se tam nastavní MySQL, aby vyhledávala ve fulltextu i kratší slova, i po změně to ale nic nenajde. Ještě to možná zkusím na nějakém menším dotazu, ale spíše to dám k ledu a budu dále využívat Google.

Editováno 6.3.2015 13:08
Nahoru Odpovědět
6.3.2015 13:08
You are the greatest project you will ever work on.
Avatar
shaman
Člen
Avatar
Odpovídá na David Hartinger
shaman:6.3.2015 15:13

Mam pocit ze si nasiel odpoved sam. V jednej odpovedi sa tam pise, ze si mas nastavit

[mysqld]
ft_min_word_len=3

Ja som robil test s mojim nastavenim kde mam minimalnu dlzku slova 4. Do tabulky som si vlozil 'cccc++' a hladal som 'cccc' alebo 'cccc++' v oboch pripadoch mi to naslo ten jeden riadok. Z toho predpokladam ze mysql si + odstrani z query stringu a vobec ho nehlada. V tvojom pripade ak chces najst c++ tak by som este znizil hodnotu minimalnej dlzky slova na 1. Predpokladam ze cestina nepouziva samotne c casto a tak ked budu ludia hladat c++ bude to vracat relevantne vysledky. :)

Editováno 6.3.2015 15:14
Nahoru Odpovědět
6.3.2015 15:13
try {...} catch (Exception ignored) { echo " ¯\_(ツ)_/¯ "; }
Avatar
shaman
Člen
Avatar
Odpovídá na David Hartinger
shaman:6.3.2015 15:18

Prikladam obrazok z predosleho komentu
Dalsia moznost je ze si namapujes fulltext boolean syntax s inymi znakmi kde tvoje + nebude.

ft_boolean_syntax = + -><()~*:""&|

zn: toto tiez nie je super riesenie, lebo potom ziskas + ale stratis iny znak :P

Nahoru Odpovědět
6.3.2015 15:18
try {...} catch (Exception ignored) { echo " ¯\_(ツ)_/¯ "; }
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na shaman
David Hartinger:6.3.2015 15:57

To nastavení jsem právě měnil... Zkusim to na nějakém jednodušším dotazu.

Nahoru Odpovědět
6.3.2015 15:57
You are the greatest project you will ever work on.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.