2009-07-12 7 views
11

Tam metin araması yapmak istediğim verileri içeren bir dizi tablo var. Tabloları UNION ile birleştirmeyi denedim, ancak sonuç tam metin dizinini kaybediyor dolayısıyla tam metin aranamıyor. Verileri tempolu bir masaya koymanın yolunun olduğunu sanmıyorum. Bu tabloları verimli bir şekilde arama yapabilmem mümkün mü? Şimdiden teşekkürler!Çoklu tablolarda MySQL tam metin araması

GÜNCELLEME: normal bir seçme ile olduğu gibi

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

endeksleri kullanılır: tam metin için benim sorgu

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

farklı tablolarda aynı şeyi arıyoruz musunuz yoksa farklı şeyler arıyorsun? Kaç tane tablo ekliyorsunuz? –

cevap

12

MySQL, birden çok tabloyu tam metin (veya herhangi bir) dizin oluşturamaz. Yani tek bir endeks kullanarak çıktı. Bir alternatif olarak

, yapabilirsin ya:

  1. gereksinimlerinizi eşleşen satırları almak için katılmak uygun olarak/sendikayı her tabloda bir dizini kullanın ve a.

  2. Dizini uygulamak için bir toplu tablo oluşturun.

  3. Arama endeksinizi sağlamak için lucene veya solr gibi bir araç kullanın. (Eğer ölçek herhangi bir tür için gidiyoruz, bu muhtemelen en iyi seçenek) kurulum üç tablo (varsa düzeltin olduğunu ben varsayalım mesaj panosu bir tür gibi görünen varlık ile

+0

En azından 5.x dalında, indeks kullanan birleşimler, tam metin dizininin kullanılamadığı yan etkilere sahip gibi görünüyor. Sorguları oldukça verimsiz kılar. :/ – Rytmis

+0

Bu ilginç - mysql bir yan etkisi sadece tablo başına bir dizin kullanabilmek için tahmin et. Tam metin arama bağlamında bunu hiç düşünmemiştim. – benlumley

+0

num 1 yapmaya çalıştığım şey, ama indeksler sendikadan sonra yok olur, iki numara yapmak istemediğim şey. anlamaya başladığım şeyi teyit ettiğiniz için teşekkürler – Samuel

1

Ben) yanıldığımı:

  1. İleti Tablosu (Message_ID, Başlık, Vücut, Açıklama, Yazar)
  2. Etiket Tablosu (TAG_ID, adı)
  3. İleti Etiketler (Message_ID, TAG_ID)
İşte

Ben

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

birlikte alaka puanları ekleyin yapacağını nasıl:

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