2009-07-12 41 views
11

Tôi có một loạt các bảng có chứa dữ liệu tôi muốn tìm kiếm toàn văn. Tôi đã thử kết hợp các bảng với UNION, nhưng kết quả mất chỉ mục toàn văn của nó để không thể tìm kiếm toàn văn. Tôi không nghĩ rằng việc đưa dữ liệu vào một bảng tạm thời là con đường để đi. Có someway rằng tôi có thể tìm kiếm đầy đủ các bảng này một cách hiệu quả? Cảm ơn trước!Tìm kiếm toàn văn MySQL trên nhiều bảng

UPDATE: truy vấn của tôi cho toàn văn là

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

Bạn đang tìm kiếm điều tương tự trong các bảng khác nhau hoặc bạn đang tìm kiếm những điều khác nhau? Bạn bao gồm bao nhiêu bảng? –

Trả lời

12

MySQL không thể tạo chỉ mục toàn văn (hoặc bất kỳ) nào trên nhiều bảng. Vì vậy, sử dụng một chỉ mục duy nhất là ra ngoài.

Là một thay thế, bạn có thể một trong hai:

  1. Sử dụng một chỉ mục trên mỗi bảng, và tham gia/công đoàn cho phù hợp để lấy hàng phù hợp yêu cầu của bạn.

  2. Tạo bảng tổng hợp để áp dụng chỉ mục.

  3. Sử dụng công cụ như lucene hoặc solr để cung cấp chỉ mục tìm kiếm của bạn. (Nếu bạn đang sử dụng bất kỳ loại tỷ lệ nào, đây có thể là lựa chọn tốt nhất)

+0

Ít nhất trong nhánh 5.x, tham gia sử dụng các chỉ mục dường như có tác dụng phụ không thể sử dụng chỉ mục toàn văn. Làm cho các truy vấn thay vì không hiệu quả. :/ – Rytmis

+0

Thats thú vị - đoán một tác dụng phụ của mysql chỉ có thể sử dụng một chỉ số cho mỗi bảng. Không bao giờ thực sự nghĩ về điều đó trong bối cảnh tìm kiếm toàn văn. – benlumley

+0

num một là những gì tôi đã cố gắng để làm, nhưng các chỉ số biến mất sau khi công đoàn, num hai là những gì tôi không muốn phải làm. cảm ơn vì đã xác nhận những gì tôi đã bắt đầu hiểu – Samuel

2

chỉ cần làm:

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

chỉ số được sử dụng vì chúng có một lựa chọn bình thường.

1

Với thiết lập của bạn là loại bảng thông báo, tôi cho rằng bạn có ba bảng (đúng nếu tôi sai):

  1. nhắn Table (message_id, Tiêu đề, cơ thể, mô tả, tác giả)
  2. Tag Table (TAG_ID, Name)
  3. nhắn Tags (message_id, TAG_ID)
01.

Dưới đây là làm thế nào tôi sẽ làm điều đó

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

Thêm điểm liên quan với nhau:

SELECT ID, Title, Description, Author, 
MATCH (Title) AGAINST ("search terms") + 
MATCH (Tags) AGAINST ("search terms") + 
MATCH (Body) AGAINST ("search terms") 
AS Relevance 
Các vấn đề liên quan