Có vẻ như các bảng InnoDB không cho phép tìm kiếm trên một số chỉ mục văn bản đầy đủ trong cùng một MATCH()
điều kiện.
Ở đây, các trường của bạn không phải tất cả đều thuộc cùng một bảng, do đó chúng được bao phủ bởi các chỉ mục khác nhau. Lưu ý rằng giới hạn tương tự cũng áp dụng nếu bạn có một bảng như thế này:
CREATE TABLE t (
f1 VARCHAR(20),
f2 VARCHAR(20),
FULLTEXT(f1), FULLTEXT(f2)
) ENGINE=InnoDB;
SELECT * FROM t
WHERE MATCH(f1, f2) AGAINST ('something in f2'); -- likely to return no row
Nó có vẻ như tìm kiếm toàn văn bản chỉ có thể tìm kiếm trên chỉ mục văn bản đầy đủ đầu tiên mà nó gặp phải nhưng đây chỉ là thứ mà tôi khấu trừ từ trải nghiệm này , vui lòng không coi điều này là đương nhiên.
Điểm mấu chốt là bạn nên chia nhỏ tìm kiếm của mình để sử dụng một chỉ mục toàn văn duy nhất cho mỗi MATCH()
mệnh đề:
SELECT * FROM auction, user, gallery, ...
WHERE
MATCH(auction.field1, auction.field2) AGAINST ('search query' IN BOOLEAN MODE) OR
MATCH(auction.field3) AGAINST ('search query' IN BOOLEAN MODE) OR
MATCH(user.field1, user.field2, user.field3) AGAINST...
Đây là minh họa về một truy vấn có thể xảy ra nếu bạn có hai chỉ mục riêng biệt trên auction
và một trên user
. Bạn cần điều chỉnh nó cho phù hợp với cấu trúc thực tế của mình (vui lòng đăng mô tả bảng của bạn nếu bạn cần thêm hướng dẫn).
Lưu ý rằng điều này chỉ áp dụng cho các bảng InnoDB. Điều thú vị là các bảng của MyISAM dường như không hiển thị cùng một giới hạn .
Cập nhật:hóa ra đây là một lỗi trong công cụ InnoDB
, được sửa trong 5.6.13 / 5.7.2. Ví dụ trên hiện không thành công với "Không thể tìm thấy chỉ mục FULLTEXT khớp với danh sách cột". Thật vậy, không có chỉ mục nào trên (f1, f2)
, nhưng một trên (f1)
và một cái khác trên (f2)
. Như changelog khuyên :
Đáng chú ý là trong khi các truy vấn như vậy trả về một tập hợp kết quả chính xác với MyISAM, chúng chạy chậm hơn người ta có thể mong đợi, vì họ im lặng bỏ qua các chỉ mục đầy đủ văn bản hiện có .