Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Sphinx - Sortowanie po stringu w kilku indexach (algorytm: kombinacje z powtórzeniami), Algorytm zmieniający string na integer po którym możemy sortować.
Kennet
post 11.01.2013, 13:23:17
Post #1





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 11.01.2013

Ostrzeżenie: (0%)
-----


Hej,

To mój pierwszy post na forum:)

Mam pewnien problem z sortowaniem wyników zwracanych przez sphinx.

Założenia:
- Sphinx posiada dwa indexy main (przebudowywany/mergowany raz dziennie) i delta (co kilka minut dla ostatnio zmodyfikowanych rekordów)
- Do zapytania dla Sphinxa podaję też limit i offset dzieki temu dostaję ograniczoną tablicę ideków
- Sphinx sam odpowiedzialny jest za sortowanie zwracanych ideków wg. trafności, daty bądz alfabetycznie.

Przy sortowaniu alfabetycznym nie mogę uzyc atrybutu str2ordinal ponieważ Sphinx oddzielnie posortuje każdy index (każdy rekord będzie miał wyliczona pozycję sortowania dla miejsca w indexie w którym on sam sie znajduje). W takim przypadku nowe rekordy gubiłyby mi się w sortowaniu.

Myslę, że najlepszym wyjściem byłoby konwertowanie sortowanego stringa na integer (nie moge przekroczyc dla niego wielkości 32bit).
Chciałbym napisać algorytm który dla stringa i podanego alfabetu (0..9aąbcć..zźż# - gdzie # zastepuje wszystkie inne znaki) wygeneruje integer określający miejsce w posortowanym zbiorze wszystkich możliwych kombinacji (dla 9 liter powinienem się zmiescićwink.gif) (ale chciałbym uniknąć też generowania zbioru wszystkich mozliwych kombinacji i szukania w nim pozycji dla stringa.)

Kolejnośc sortowania określa miejsce w ciagu podanego alfabetu (słowa zaczynające się zerem najwyżej itd.).

Póki co napisałem prostą funkcję dla 5 liter (jeszcze dokładnie nie testowałem:P):

  1. public function strToSortInt($string)
  2. {
  3. $numberOfLetters = 5;
  4. $alfabet = array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'ą', 'b', 'c', 'ć', 'd', 'e', 'ę', 'f', 'g', 'h', 'i',
  5. 'j', 'k', 'l', 'ł', 'm', 'n', 'ń', 'o', 'ó', 'p', 'r', 's', 'ś', 't', 'u', 'w', 'y', 'z', 'ź', 'ż');
  6. $others = count($alfabet);
  7.  
  8. $int = 0;
  9. //zamieniam string na tablicę z pierwszymi 5 literami
  10. $string = $this->mbStringToArray(mb_strtolower(mb_substr($string, 0, $numberOfLetters, "UTF-8"), "UTF-8"));
  11.  
  12. $pow = $numberOfLetters;
  13. for ($i = 0; $i <= $numberOfLetters - 1; $i++) {
  14. if (isset($string[$i])) {
  15. $val = array_search(strval($string[$i]), $alfabet, TRUE);
  16. if ($val == FALSE) {
  17. $val = $others;
  18. }
  19. } else {
  20. $val = $others;
  21. }
  22. $pow--;
  23. $int += $val * pow(100, $pow);
  24. }
  25. return $int;
  26. }


Ktoś spotkał się może z takim problemem? A moze jest jakis zupełnie inny patent na takie sortowanie wg stringa w sphinxie po kilku indexach.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 28.03.2024 - 10:45