Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Skrypty obsługi baz danych _ Sphinx - Sortowanie po stringu w kilku indexach (algorytm: kombinacje z powtórzeniami)

Napisany przez: Kennet 11.01.2013, 13:23:17

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 = http://www.php.net/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 = http://www.php.net/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 (http://www.php.net/isset($string[$i])) {
  15. $val = http://www.php.net/array_search(http://www.php.net/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.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)