ugrás a tartalomhoz

Komplex rendszer, párhuzamosítás

Tanul0 · 2013. Jan. 21. (H), 18.09
Sziasztok!

Adott egy rendszer, amelynek a lényege, hogy tartalmakat keresünk különböző kereső feltételek mellett, amelyeket a felhasználók definiálnak. Egy felhasználó több keresési feltételt definiálhat.

Egy keresési definiíció a következő képp nézhet ki:

- Korlátlan számú kulcsszó/kifejezés
- Korlátlan számú kód (csak számok)

A kódok és a kulcsszavak közti kapcsolat lehet AND vagy OR (nem egyesével, hanem mint halmazok között, a halmazon belül OR kapcsolat van). A keresésnél be lehet állítani, hogy teljes egyezés számít, vagy tartalmazás is.

Az adatbázis mysql, és a mezők amelyekben keresünk LONGTEXT típusúak. Naponta minimum 1000, maximum 5000 új sor szokott lenni, amelyet "match"-elni kell.

A jelenlegi rendszer működése:

Első user: veszi a keresédi definícióit és végig iterál rajtuk a következő módon:

1. lépés Veszi a tartalmakat, amelyek mezőit split-eli először whitespace-ként, majd végigmegy contains/equals -al a kódokon és kulcsszavakon (tartalomban található szavak szám szorozva a kulcsszavak plusz a kódok számával). Az első találat esetén true-val visszatér (Persze ha AND kapcsolat van beállítva, akkor külön a kódon és külön a kulcsszavakon).

2. lépés a tartalmat fel split-eli írásjelek szerint, majd az előző lépéshez hasonló módon ismét végig megy rajtuk. (A kifejezések miatt...)

3. lépés veszi a következő keresési definiíciót majd ugyan ezt végrehajta az adatbázisnak ezen a során.

Ezt minden egyes sorra megcsinálja, majd meg a következő user-ra.

A kinyert tartalmakat 100-asával perzisztálja egy külön táblába.

Maga a folyamat még kevés adattal és kevés felhasználóval működött, viszont most már használhatatlan, és nincs az a futásidő és memória mennyiség ami elég lenne az alkalmazásnak. (A rendszert átvettem, nem én írtam).

A kérdésem az lenne, hogy milyen módon lehetne ezt a rendszert optimalizálni, esetleg párhuzamosítani.

Java regex-el az egyez adatbázis mezőkre eseleg.

(Indexelő alkalmazás egyelőre nem játszik sajnos, gondolok itt: elasticsearch, lucene index. Gyors megoldás kell, amíg elkészül a teljesen új rendszer, mert ezzel nem érdemes hosszútávon foglalkozni.)


Előre is köszönöm!
 
1

Solr

janoszen · 2013. Jan. 21. (H), 18.29
Ilyesmire tipikusan specialis szovegkeresot, pl. Solrt szokott az ember hasznalni.
2

Solr / Lucene

sandornemeth · 2013. Jan. 21. (H), 19.31
Igazabol gyorsabb megoldas, mint egy Solr bevetese (ami gyakorlatilag kulon szerver, csak be kell kuldeni az adatokat, meg definialni egy adatsemat), nem nagyon van. Gyakorlatilag par napos munkaval integralhato, es az eddigi adatokat is egy eleg egyszeru scripttel fel tudod olvasni.
3

"Indexelő alkalmazás egyelőre

Tanul0 · 2013. Jan. 21. (H), 20.01
"Indexelő alkalmazás egyelőre nem játszik sajnos, gondolok itt: elasticsearch, lucene index"

A Solr-t kifelejtettem a listából, de egyelőre az sajnos nem játszik.

A bajt az jelenti, hogy rengeteg az egymásba ágyazott ciklus.
4

Hibernate search-ről valaki

Tanul0 · 2013. Jan. 22. (K), 11.32
Hibernate search-ről valaki hallott már? esetleg van vele valakinek tapasztalata? (Jelen pillanatban ez jöhet szóba, ha jól értelmezem, akkor ehhez nem kell tomcat)

http://www.hibernate.org/subprojects/search.html
6

Az a hibernate corera épül,

BlaZe · 2013. Jan. 22. (K), 12.03
Az a hibernate corera épül, meg kell legyenek a tábla mappeléseid. Ehhez konkrétan valóban nem kell tomcat, de ha nem egy javas rendszerről beszélünk (gondolom nem, mert akkor nem lenne gond a tomcat/akármi más), amiben ott vannak a hibernate mappingek, akkor ez egy hosszabb/értelmetlenebb út. Szerintem sem úszod meg egyszerűbben, mintha felraksz valamit az említettek közül.

A baj az, hogy a rendszer jelenleg fordítva ül a lovon (ha jól értem, akkor userenként feldarabol mindent újra). Így vagy te átírod az egészet, vagy integrálsz egy kereső cuccot. Én az utóbbit tenném, ez lényegesen egyszerűbb. Bedobálhattok plusz vasat is (ha a kód erre fel van készítve), de az ilyen problémákra nem ésszerű válasz, mert max időt nyersz vele. Ráadásul az integrációhoz képest drágább és bonyolultabb is.
9

Java-ról beszélünk, és

Tanul0 · 2013. Jan. 22. (K), 12.26
Java-ról beszélünk, és hibernate-t és jpa-t használunk. (nem realtime megy a keresés, előre definiált keresési feltételek alapján tartalom szűrés-t végzünk, a a keresési feltételek alapján kapott tartalmak egy külön táblában tárolódnak a keresési feltételek azonosítójával ellátva.)

tomcat-ra nincs lehetőség jelen keretek között (és szükségünk sincs rá, a fentebb lévők szerint.)

Új vas sem játszik, jelenleg is egy vps áll a rendelkezésünkre és egy lokális szerver (ami itt van az irodába és mentésre szolgál)
10

Akkor szerintem "csak" át

BlaZe · 2013. Jan. 22. (K), 13.30
Akkor szerintem "csak" át kell alakítani a folyamataitokat és menni fog. A Hibernate Search is lucene-t használ amúgy. Itt egy tutorial hozzá. Itt pedig az architektúra. Szerintem a 2.2.2 pont kéne nektek.
12

Igen, tudom, azért lenne ez a

Tanul0 · 2013. Jan. 22. (K), 14.02
Igen, tudom, azért lenne ez a legjobb, mert szerintem az index fájlokat a későbbiek során valamilyen módon át lehetne vinni mondjuk egy Solr vagy ElasticSearch alá. Mivel a felület a rendszerhez PHP, így valószínűleg Solr lesz, mivel ehhez létezik PHP extension. A JMS architektúrát a redundancia miatt gondoltad, vagy amiatt, hogy több vason lehessen futtatni?
13

A JMS architektúrát a

BlaZe · 2013. Jan. 22. (K), 16.36
A JMS architektúrát a redundancia miatt gondoltad, vagy amiatt, hogy több vason lehessen futtatni?

A több vas lehetősége, és a terhelés kordában tartása miatt. Ha azt mondod, hogy 8 szálon pollozod a queue-t, akkor 8 szál fog tekerni, és nem rogy be a szerver akkor sem, ha valamiért bevágsz hirtelen 1000 sort a db-be, amit le kéne indexelni. A több vasat viszont nem tudom, ahhoz Hibernate searchnek tudnia kéne több mastert, amit nem említ a doksija, vagy csak én nem jutottam el odáig. A slave-ek már csak a keresésnél játszanak (esetedben a user tartalom összerendelésnél), de ott már biztos tudsz terhelést elosztani több vas között akár JMS-sel, akár mással. És gondolom jelenleg ez a nagyobb erőforrásigény, nem a tartalmak indexelése.
5

text -> integer

szabo.b.gabor · 2013. Jan. 22. (K), 12.00
egyik tartalomkezelő amit használtam az úgy oldotta ezt meg, hogy az új tartalmakat szavanként feldolgozta, minden szóhoz lett egy id, valamint összerendelte az így kapott azonosítókat a tartalmak azonosítóival.

az adott kulcsszóhoz tartozó azonosító(k) gyorsan megkaphatók, és az ezekhez tartozó cikkek is.

tulajdonképpen ha úgy tetszik tag-elte az összes előforduló szóval.
7

Ez úgy hangzik mint az

kuka · 2013. Jan. 22. (K), 12.17
Ez úgy hangzik mint az Inverted index. Alapból egyszerű, de ha valaha nem csak elszigetelt szavakra, hanem "egymásutáni szavakra, azaz szövegrészre" is kell keresni, akkor bonyolódik.
8

ezzel az a baj, hogy

Tanul0 · 2013. Jan. 22. (K), 12.18
ezzel az a baj, hogy kifejezések esetén még a sorrendiségre is kell figyelni.
11

azért gondolom egy kisebb

szabo.b.gabor · 2013. Jan. 22. (K), 13.55
azért gondolom egy kisebb halmazon már kevésbé fájdalmas keresgélni. mérlegelni már nem az én dolgom.