Tính điểm MATCH () AGAINST () từ SỐ LƯỢNG KHÔNG ĐƯỢC PHÉP không dành cho MACHI BẢNG


10

Tôi đang cố gắng để có điểm cho toàn bộ phần của câu lệnh CHỌN

SELECT *,MATCH(`result`) AGAINST('keyword') as `score` FROM `table1` WHERE MATCH(`result`) AGAINST('keyword')
UNION
SELECT *,MATCH(`content`) AGAINST('keyword') as `score` FROM `table2` WHERE MATCH(`content`) AGAINST('keyword')
UNION
SELECT *,MATCH(`text`) AGAINST('keyword') as `score` FROM `table3` WHERE MATCH(`text`) AGAINST('keyword')

Trong trường hợp như vậy, điểm số trên mỗi bảng + chúng không được sắp xếp theo mức độ liên quan

Nhưng tôi đã thử phương pháp này, nó đang hoạt động nhưng không có giá trị sản xuất

SELECT * FROM (
    SELECT *,MATCH(`result`) AGAINST('keyword') as `score` FROM `table1` WHERE MATCH(`result`) AGAINST('keyword')
    UNION
    SELECT *,MATCH(`content`) AGAINST('keyword') as `score` FROM `table2` WHERE MATCH(`content`) AGAINST('keyword')
    UNION
    SELECT *,MATCH(`text`) AGAINST('keyword') as `score` FROM `table3` WHERE MATCH(`text`) AGAINST('keyword')
) as `combined` ORDER BY `score` DESC

Mã trên không thích vì điểm có mỗi bảng, chúng được nối và đặt hàng. Một cách tiếp cận xấu.

Vì vậy, tôi đã cố gắng để MATCH() AGAINST()cho datatrong TOP CẤP CHỌN cũng này. (KHÔNG LÀM VIỆC)

SELECT *,MATCH(`data`) AGAINST('keyword') as `good_score` FROM (
        SELECT *,`result` as `data`,MATCH(`result`) AGAINST('keyword') as `score` FROM `table1` WHERE MATCH(`result`) AGAINST('keyword')
        UNION
        SELECT *,`content` as `data`,MATCH(`content`) AGAINST('keyword') as `score` FROM `table2` WHERE MATCH(`content`) AGAINST('keyword')
        UNION
        SELECT *,`text` as `data`,MATCH(`text`) AGAINST('keyword') as `score` FROM `table3` WHERE MATCH(`text`) AGAINST('keyword')
    ) as `combined` ORDER BY `good_score` DESC

Tuyên bố trên là hoàn hảo đối với tôi, nhưng nó không hoạt động vì datacột được tạo nhanh chóng và nó không hỗ trợ để có INDEX FULLTEXT.

Câu hỏi của tôi là làm thế nào để tiến hành để làm cho động cơ của tôi làm việc.

  • Bạn có thể bằng cách nào đó thực hiện dataFULLTEXT
  • Có cách nào để làm cho nó hoạt động ngoài CHẾ ĐỘ BOOLESE không hỗ trợ điểm số không
  • Có một cách tiếp cận cho toàn bộ chủ đề này sẽ làm cho nó hoạt động? Tạo một bảng tạm thời không giải quyết được điều này, quy tắc MATCH () AGAINST () 50% tạo ra một truy vấn trả về 0 kết quả, nhưng có rất nhiều
  • Có lẽ có một cái gì đó nhỏ mà tôi bỏ lỡ?
  • Tạo VIEW cũng không hoạt động, MySQL không hỗ trợ INDEX-es trên VIEWs.
  • Có lẽ đó là một ý tưởng tốt để sử dụng IN BOOLESE MODE và tạo điểm số bằng tay?

Tôi đã làm việc cho vấn đề này trong hơn hai ngày. Vì vậy, tôi vui lòng yêu cầu một số trợ giúp. Cảm ơn.

Câu trả lời:


2

Có lẽ bạn có thể ghi lại những điều sau từ ba (3) bảng

  • tên bảng
  • cột từ tên bảng
  • Chỉ số FULLTEXT trên cột

Đây là mã:

DROP TABLE IF EXISTS combined_data;
CREATE TABLE combined_data
(
    source_table VARCHAR(64),
    source_id INT NOT NULL,
    data TEXT NOT NULL,
    FULLTEXT (data)
) ENGINE=MyISAM;
--
ALTER TABLE combined_data DISABLE KEYS;
--
INSERT INTO combined_data (source_table,source_id,data) VALUES
SELECT 'table1',id,`result` FROM table1 WHERE MATCH(`result`) AGAINST('keyword');
--
INSERT INTO combined_data (source_table,source_id,data) VALUES
SELECT 'table2',id,`content` FROM table1 WHERE MATCH(`content`) AGAINST('keyword');
--
INSERT INTO combined_data (source_table,source_id,data) VALUES
SELECT 'table3',id,`text` FROM table1 WHERE MATCH(`text`) AGAINST('keyword');
--
ALTER TABLE combined_data ENABLE KEYS;

Bây giờ bạn có thể chạy một truy vấn duy nhất đối với một bảng

SELECT *,MATCH(`data`) AGAINST('keyword') as `good_score`
FROM combined_data
ORDER BY `good_score` DESC;

Hãy thử một lần !!!


Tôi đã làm điều tương tự trước đây và nó không hoạt động. Cái này cũng không hoạt động. CHỌN cuối cùng từ kết hợp_data là good_score với MATCH () và AGAINST () cho kết quả 0. Tôi đã nghiên cứu về vấn đề này và phát hiện ra rằng NON IN BOOLESE MODE áp dụng quy tắc 50%, do bản chất của nó bằng cách nào đó bỏ qua kết quả từ một bảng khi có mối quan hệ toán học với 50% kết quả. Tuy nhiên, cảm ơn bạn đã gợi ý, nhưng tôi muốn nghe một số ý tưởng khác. Cảm ơn một lần nữa.
dachint
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.