Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Sphinx] Sortowanie uwzględniając kolejność wystąpień słowa
Forum PHP.pl > Forum > PHP
Walian
Jak ustawiać sortowanie, by Sphinx uwzględnił także kolejność występowania szukanego słowa w rekordach?
Czyli jak wyszukam "lampa" - żeby najpierw pokazywał rekordy, w których to słowo znajduje się jak najbliżej początku, potem rekordy, w których znajduje się jako drugie w kolejności itd.

W tej chwili mam po prostu:
  1. $sphinx->SetSortMode(SPH_SORT_RELEVANCE);


Wersja:
Sphinx 1.10-beta (r2420; Jul 19, 2010)
działa pod kontrolą CentOS.
wookieb
Ale w takim razie nie jest Ci potrzebny parametr trafności wyszukiwania skoro z góry skazujesz sortowanie na "bliskość" wystąpieniA słowa.
1) nie wiem czy jest to możliwe - podejrzewam, że w bardzo ograniczonym stopniu. Poza tym na liście funkcji http://sphinxsearch.com/docs/current.html#...yntax#sort-expr nie znalazłem funkcji do wyszukiwania pozycji w tekście
2) jeżeli jest to w jakiś sposób możliwe to jak chcesz uwzględnić stemming?
w skrócie, nie kombinujmy smile.gif Parametr trafność został wymyślony przez naprawdę niezłych ludzi więc po co to "poprawiać"?
Walian
To w zasadzie nie był mój pomysł, tylko szefa, który chciał by wyszukiwarka zwracała jak najlepsze wyniki. No ale wygląda na to, że masz rację.
Tak dokładne wyszukiwanie nie jest dla nas koniecznością, ważniejsza się tu okazuje kosmiczna wydajność "Świnksa", dzięki której będę mógł przyspieszyć nie tylko wyszukiwanie produktów, ale także ich przeglądanie, filtrowanie i zliczanie znalezionych produktów - wyświetlane obok nazw kategorii ;-)
wookieb
Do tego celu o którym mówisz znacznie lepiej wypada (pod względem wydajności) Solr (dzięki FACET-om). Ale to oczywiście kwestia gustu.
Walian
Nie sprawdzałem tego jeszcze (Solr to moduł do Apache tak?), ale już wystarczająco czasu spędziłem nad ogarnięciem Sphinx-a. Jakbym teraz powiedział, że chcę wypróbować coś innego to... sam rozumisz biggrin.gif
Ale na pewno kiedyś sprawdzę. Wypada znać wszystko. Na pewno sprawdzę też Lucene. Póki co wdrożę Sphinx-a. I tak na razie spełnia wszystkie nasze wymagania. Dzięki za odpowiedzi.
wookieb
Solr jest oddzielnym oprogramowaniem tylko, że pod opieka fundacji Apache. Solr aktualnie ściśle współpracuje z LUCENE i tak naprawdę jest od niej zależny. Trwają prace nad stałym połączeniem obu narzędzi (o ile pamiętam ma wyjść pod nazwą Solr 4.0).
Jak używasz sphinxa to pamiętaj, że po przekroczeniu pewnej ilości produktów (a dokładniej więcej niż ustawienie max_matches w sphinx) będziesz zmuszony do zmiany konfiguracji. Ale napominam o tym "tak tylko" smile.gif
Walian
Mam obecnie ustawione 10000 i taka ilość wydaje mi się być wystarczającą. Jak do tej pory najwięcej podstron (po 20 produktów na jednej) to było grubo ponad 6 tyś. więc jakiś zapas jest i raczej się drastycznie nie zmniejszy. Jest około 3x tyle co być powinno.

A wiesz coś na temat Lucene? Korzystałeś z tego? Może potrafiłbyś przyrównać Solr czy samego (samej?) Lucene do Sphinx-a by pokazać różnice? Pytam ot tak - z ciekawości. O Lucene wiem tylko tyle, że została napisana w Javie smile.gif
wookieb
Sphinx nie ma replikacji, Solr tak.
Sphinx jest mniej wydajny od Solra.
Solr jest o wiele bardziej konfigurowalny jeżeli chodzi o wszystkie operacje wyszukiwania pełnotekstowego.
Ograniczenie ilości wyników max_matches jest dość wkurzające a podane zbyt dużej wartości spowoduje problemy z wydajnością.
Solr jest niesamowicie prosty w obsłudze.
Solr posiada FACETy czyli np twoje kategorie + ilość rekordów znalezionych.

Różnic jest znacznie więcej. Wystarczy, że poszukasz porównań w googlach smile.gif
Generalnie byłem zwolennikiem Sphinxa dopóki nie poznałem SOLR-a
Walian
No to widzę, że powinienem się Solrem poważnie zainteresować.
Dzięki za informacje ;-)

Edit:
Mam jeszcze jeden problem.
Używam SPH_MATCH_ANY.
Mam m.in taki produkt:
Kod
Apple MacBook Pro 15"" 2.66GHz/4GB/320GB/GeForce 9600M GT/SD

Gdy go wyszukuję poprzez wpisanie:
Kod
geforce 9600*

to mi go znajduje, natomiast używając poniższych kombinacji już nie:
Kod
apple geforce

Kod
apple geforce*

Kod
apple* geforce*

Kod
apple * geforce *

Kod
apple geforce 9600m

Kod
apple geforce 9600m*

Kod
geforce apple*


Widocznie zbyt restrykcyjnie szuka. Da się to jakoś obejść nie tracąc znacząco na dokładności sortowania?

Edit:
Zauważyłem, że takie coś daje rade:
Kod
geforce* | apple*

Ale czy to dobry pomysł?

EDIT:
Widzę, że to nie jest dobre rozwiązanie. Żałuję, że nie sprawdziłem na samym początku czy będzie taki problem w Sphinx-ie.
Jeśli próbuję znaleźć np:
Kod
ASUS GeForce 9500GT 1024MB DDR2 / 128bit DVI / HDMI PCI-E (550 / 800)

wpisując:
Kod
asus geforce*

to Sphinx go znajduje.
Jak wpiszę słowa w odwrotnej kolejności to nie znajduje.
Wpisanie:
Kod
geforce | asus*

Daje zbyt dużo wyników tzn zwraca na początku:
Kod
ASUS P5E-VM HDMI Intel G35 Socket 775

a pierwszy GeForce-em jaki znajduje się na liście wyników (dużo niżej) to:
Kod
Asus ENGTS250 GeForce GTS 250 CUDA 1GB DDR3 (256bit),2xDualDVI, HDCP, BOX

Wpisanie:
Kod
geforce & asus*

Ani trochę nie zmienia wyników! Czyżby bug?

Jakieś pomysły?
wookieb
a po jakim parametrze sortujesz?
Walian
Chyba już wiem co było nie tak - miałem w kodzie:
  1. $result = $sphinx->Query($sphinx->EscapeString($str), 'nazwa_indeksu');

Ale ja zakręcony jestem :/
Wyrzuciłem już to escape-owanie.

Teraz wpisanie:
Kod
geforce* & asus*

Zwraca:
Kod
ASUS M3N WS, GeForce 8200, DualDDR2-1066, SATA2, RAID, GBLAN, VGA, FW, ATX (M3N WS)

Więc chyba jest dobrze. Dzięki za odpowiedź - Twoje pytanie sprawiło, że znowu zacząłem grzebać w kodzie i znalazłem przyczynę smile.gif

EDIT:
Prawie dobrze, jest jeszcze problem z wyszukiwaniami:
Kod
5850*

Nic nie zwraca, a jest taki produkt:
Kod
Gigabyte Radeon HD 5850 GPU, 1GB DDR5 (256bit), PCI-E, HDMI DualDVI D-sub, BOX

Po wpisaniu:
Kod
9600gt*

Znajduje tylko produkt:
Kod
TRILINE NOWY ! TRILINE ALIVIO 31A-7400H7 (E7400/ 3GB/ 9600GT 1GB/ 500GB/ DVDRW/WIN 7 PREMIUM)


a są jeszcze:
Kod
ZOTAC GF 9600GT CUDA,ECO Edition, 1GB DDR3 (256bit), HDTV DualDVI, PCI-E, BOX
Gigabyte GeForce 9600GT CUDA, 1GB GDDR3 (256bit),2x DVI-I HDMI HDCP, PCI-E, BOX
Gigabyte GeForce CUDA 9600GT, 1GB GDDR3 (256bit), HDMI DVI D-SUB, PCI-E, BOX


Czyżby ten problem dotyczył tylko liczb?

EDIT:
Ok sprawa załatwiona - problem stanowiło źle ustawione "ignore_chars" w konfiguracji indeksu smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.