Wpis z mikrobloga

Pytanie to speców od #elasticsearch.
Zacząłem bawić się tym silnikiem.
Zindeksowałem sobie jakąś tabelę.

Mam zapytanie SQL, które pobiera rekordy z tej tabeli - teraz chciałbym podmienić silnik i podłożyć elastica.
Czy jest jakiś sprytny sposób, żeby SQLowego WHERE sparsować do elasticowego query?
Jakaś biblioteka, może coś innego?

Każde zapytanie dostosowywać do Elastica w przypadku dużego systemu to będzie koszmar.
Macie jakieś wskazówki, jak to zrobić łatwiej?

Dodam, że akcja dzieje się w #php.
  • 9
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@zdzisiek-bula: Nie mów, że do funkcji szukającej przekazywane jest zapytanie? Znajdź miejsce, w którym są zbierane warunki. Wepnij elastica do tego miejsca. Przekaż do niego te od nazw, odbierz id, wstaw id do warunków dla zapytania.

Miejsc nie będzie dużo: szybkie wyszukiwanie ajaxowe i globalna szukarka.

No chyba, że ten duży system został napisany tak, że jest kilkanaście różnych miejsc, w których robione (i szukane) jest dokładnie to samo?
  • Odpowiedz
@januzi: Wyszukiwarek różnych elementów w tym systemie jest co najmniej kilkadziesiąt. Co prawda, na początek potrzeba mi przerobić kilka z nich, ale docelowo pewnie będą kolejne i szukam optymalnego sposobu, jak to zrobić...

Twoje rozwiązanie jest fajne, jak jest jedno miejsce to poprawy - ja mam niestety mniej komfortową sytuację :/
  • Odpowiedz
@januzi: Jest metoda, przez którą przechodzą wszystkie te zapytania do bazy, ale tam mają już postać SQL. Mogę w niej grzebać / podmieniać ją do woli i właśnie pytanie, jak takie zapytanie SQL sparsować do formy zjadliwej przez elastica?
  • Odpowiedz
@januzi: jestem na etapie rozważania różnych koncepcji, więc nie mam wrzuconego jeszcze właściwie nic. Na pewno łatwiej byłoby mi wrzucić wszystkie kolumny.
W ogóle ma sens przez elastica szukać po czymś innym, niż tekst? Daty, przedziały liczbowe itp? Czy to się raczej nie sprawdzi?
  • Odpowiedz
@zdzisiek-bula: W szukaniu największym problemem są dopasowania w nazwach. Cała reszta kolumn idzie bardzo prosto.

Tak więc, jeśli nazwy tych kilkudziesięciu szukających funkcji są ze sobą związane jakimś słowem ("szukaj", "search", itd), to przy pomocy debug_backtrace określasz źródło zapytania i jeśli znajdzie się tam odpowiednie słowo, to parsujesz zapytanie, wyciągasz where (.*) (z pominięciem order/group/limit) i wyciągasz kolumny zindeksowane przez elastic search. Wrzucasz do elastica pytanie o id dokumentów, sklejasz
  • Odpowiedz
@januzi: dobra, jakaś koncepcja mi się zrodziła, ale stanąłem przed kolejnym dylematem.

Załóżmy, że mam zapytanie SQL w stylu:

SELECT * FROM tabela WHERE a = 1 AND b = 2 AND (c = 3 OR c = 4) AND d=5 AND e IN (6,7,8) AND f > 20 AND f<40
Jak to teraz ubrać
  • Odpowiedz
@zdzisiek-bula: Ew. must match

Jak nie spróbujesz, to nie przekonasz się co będzie najlepsze. Dla takich liczbowych, to sam indeks z mysqla powinien spokojnie wystarczyć (nałożony oczywiście na odpowiednie kolumny).
  • Odpowiedz