3 Stimmen

Sphinx-Suchmaschine, ein paar kurze Fragen

Also, ich bin gerade erst anfangen zu lesen, bis auf diese, ich habe nie eine Suche in PHP vor implementiert. Ich habe ein paar Fragen, die ich mich gefragt habe:

  • So wie es sich anhört, braucht Sphinx einen 'Daemon', ein Programm, das im Hintergrund Hintergrund läuft, um zu funktionieren?
  • Angenommen, ich habe einen Index einer mySQL Tabelle, dann lädt ein Benutzer einen weiteren Datensatz hoch. Damit die Suche diesen Datensatz anzeigt diesen Datensatz anzeigt, muss ich den den Index jedes Mal neu aufbauen, wenn wenn ein Benutzer einen Datensatz aktualisiert/erstellt Datensatz erstellt?

Danke.

5voto

Ian Punkte 1569

Grundsätzlich benötigen Sie einen Basisindex und dann einen Delta-Index. Der Delta-Index aktualisiert alles, was im Basisindex enthalten ist. Sie könnten also den Basisindex um 1 Uhr morgens laufen lassen und dann alle 5 Minuten den Delta-Index aktualisieren. Sie speichern einen Zeitstempel entweder in einer Tabelle oder in einer anderen Datenbank, der steuert, welche Datensätze in den Delta-Index aufgenommen werden.

Sie können dann in sql_query_killlist nachsehen, um Dinge zu entfernen, die gelöscht wurden, siehe die Dokumentation.

Ein Beispiel für einen Konf könnte folgendermaßen aussehen.

source _user
{
    type = mysql
    sql_host = localhost
    sql_user = root
    sql_pass =
    sql_db = db
    sql_port = 3306
    sql_attr_uint = category_id
    sql_attr_timestamp = time_posted
}

source user_base : _user
{
    sql_query_pre = REPLACE INTO sphinx_lastrun (object_name, object_value) SELECT 'users', @max_stamp:=UNIX_TIMESTAMP(MAX(stamp))-1 FROM users
    sql_query = SELECT id, category_id, name, UNIX_TIMESTAMP(stamp) AS stamp FROM users WHERE stamp < FROM_UNIXTIME(@max_stamp)
    sql_query_info = SELECT id FROM users WHERE id=$id  
}

source user_incr : _user
{
    sql_query = SELECT id, category_id, name, UNIX_TIMESTAMP(stamp) AS stamp FROM users WHERE stamp >= (SELECT FROM_UNIXTIME(object_value) FROM sphinx_lastrun WHERE object_name = 'users')

    # You'll need sql_query_killlist to get rid of stuff that is deleted. See the docs

    sql_query_info = SELECT id FROM users WHERE id=$id      
}

index _user
{
    docinfo = extern
    mlock = 0
    morphology = none
    min_word_len = 2
    charset_type = sbcs
    min_prefix_len = 3
    enable_star = 1
}

index user_base : _user
{
    source = user_base
    path = /opt/sphinx/var/data/user_base
}

index user_incr : _user
{
    source = user_incr
    path = /opt/sphinx/var/data/user_incr
}

index user
{
    type = distributed
    local = user_base
    local = user_incr
}

searchd
{
    listen = 3312
    log = /opt/sphinx/var/log/searchd/searchd.log
    query_log = /opt/sphinx/var/log/searchd/query.log
    pid_file = /opt/sphinx/var/log/searchd/searchd.pid
}

1voto

Jan Hančič Punkte 51654

Um Ihre erste Frage zu beantworten: Ja, Sphinx verfügt über einen Daemon, der im Hintergrund läuft und auf Anweisung Suchvorgänge durchführt.

0voto

Vinay Sajip Punkte 89444

Sie können ein inkrementelles Indizierungsschema verwenden, siehe aquí .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X