2009-07-12 19 views
11

Ich habe eine Reihe von Tabellen, die Daten enthalten, die ich zur Volltextsuche möchte. Ich habe versucht, die Tabellen mit UNION zu kombinieren, aber das Ergebnis verliert seinen Volltext-Index, so dass kein Volltext gesucht werden kann. Ich denke nicht, dass es die richtige Art ist, die Daten in eine temporäre Tabelle zu legen. Gibt es eine Möglichkeit, dass ich diese Tabellen effizient durchsuchen kann? Danke im Voraus!MySQL Volltextsuche über mehrere Tabellen

UPDATE: meine Anfrage für Volltext war

SELECT ID, Title, Description, Author, MATCH (Title,Tags,Body) AGAINST ("search terms") AS Relevance 
FROM [combination of tables goes here] 
WHERE MATCH (Title,Tags,Body) AGAINST ("search terms") 
+0

Sind Sie für die gleiche Sache in den verschiedenen Tabellen suchen oder suchen Sie verschiedene Dinge? Wie viele Tische hast du? –

Antwort

12

MySQL kann keinen Volltext (oder irgendeinen) Index über mehrere Tabellen hinweg erstellen. Also ist die Verwendung eines einzelnen Indexes out.

Als Alternative, können Sie entweder:

  1. Verwenden Sie für jede Tabelle einen Index und eine Join/union gegebenenfalls die Zeilen abzurufen, die Ihren Anforderungen entsprechen.

  2. Erstellen Sie eine aggregierte Tabelle, auf die der Index angewendet werden soll.

  3. Verwenden Sie ein Tool wie Lucene oder Solr, um Ihren Suchindex bereitzustellen. (Wenn Sie für jede Art von Skala gehen, ist dies wahrscheinlich die beste Option)

+0

Zumindest im 5.x-Zweig scheinen Joins, die Indizes verwenden, den Nebeneffekt zu haben, dass der Volltextindex nicht verwendet werden kann. Macht die Abfragen ziemlich ineffizient. :/ – Rytmis

+0

Das ist interessant - erraten Sie es ist eine Nebenwirkung von MySQL nur in der Lage, einen Index pro Tabelle zu verwenden. Nie wirklich darüber nachgedacht im Kontext der Volltextsuche. – benlumley

+0

Nummer eins ist was ich versuchte zu tun, aber die Indizes verschwinden nach der Vereinigung, Nummer zwei ist, was ich nicht tun wollte. Danke für die Bestätigung, was ich angefangen habe zu verstehen – Samuel

2

einfach tun:

select * from table a where a.col=myval 
union 
select * from table b where b.col=myval 
.. 

Indizes verwendet werden, wie sie mit einem normalen wählen sind.

1

Mit Ihrem Setup zu sein, was eine Art von Nachricht im Forum zu sein scheint, Ich gehe davon aus, dass Sie drei Tabellen (korrigiert mich wenn ich falsch ist):

  1. Meldungstabelle (Message_ID, Titel, Körper, Beschreibung, Autor)
  2. Tag Tabelle (tag_id, Name)
  3. Nachricht Schlagworte (Message_ID, tag_id)

Hier ist, wie ich es zusammen

SELECT Message.Message_ID, Message.Title, Message.Description, Message.Author, 
    IFNULL( 
    MATCH (Name) 
    AGAINST (?) 
    , 
    IFNULL(
     MATCH (Message.Title) 
     AGAINST (?) 
     , 
     MATCH (Message.Body) 
     AGAINST (?) 
    ) 
) AS Relevance 
FROM Message, Tag, Message_Tag 
WHERE Message.Message_ID = Message_Tag.Message_ID AND Message_Tag.Tag_ID = Tag.Tag_ID 
    AND (
    MATCH (Name) 
    AGAINST (?) 
    OR 
    MATCH (Message.Title) 
    AGAINST (?) 
    OR 
    MATCH (Message.Body) 
    AGAINST (?) 
) 
3

Fügen Sie die Relevanz Partituren tun würde:

SELECT ID, Title, Description, Author, 
MATCH (Title) AGAINST ("search terms") + 
MATCH (Tags) AGAINST ("search terms") + 
MATCH (Body) AGAINST ("search terms") 
AS Relevance