Avatar
1
Nguyen Thai Son Beginner
Completion Suggester
Em đang sử dụng "Completion Suggester" để đưa ra gợi ý khi người dùng typing, dựa theo trường description của bộ phim. Có cách nào để đưa ra gợi ý một cách ngắn gọn, chỉ gồm 2-3 từ gần từ đã match, thay vì trả về toàn bộ nội dung đã match không ạ? Ví dụ: em có description của một bộ phim như sau "At a New Year's Eve party in 1999, Tony Stark meets scientist Maya Hansen, the inventor of Extremis, an experimental regenerative treatment that allows recovery from crippling injuries." Khi typing từ khoá "regenerative", thay vì đưa ra gợi ý là cả câu như trên, mình sẽ gợi ý cụm từ "experimental regenerative" hoặc "regenerative treatment". Ngoài ra, sử dụng các giải pháp khác ngoài "Completion Suggester" cũng đều ok ạ
  • Answer
Remain: 5
1 Answer
Avatar
tvd12 Beginner
tvd12 Beginner
Em sẽ tách từ khóa của em ra ra thành các từ riêng lẻ, ví dụ từ khóa At a New Year's Eve party sẽ được tách thành:
  • At
  • At a
  • At a New
  • At a New Year's
  • At a New Year's Eve
  • At a New Year's Eve party
  • a
  • New
  • Year's
  • Eve
  • party

Vàl ưu lại vào biến keyword_list.

Tiếp theo sẽ có 2 cách:

Cách 1. Nếu như em không có quá nhiều dữ liệu, tầm khoảng 100 nghìn bản ghi đổ lại thì em có thể dùng kiểu like:

SELECT *
FROM your_table
WHERE your_column LIKE ANY (SELECT CONCAT('%', your_string, '%') FROM keyword_list);

Cách 2: Nếu cơ sở dữ liệu của em lớn, em sẽ cần tạo ra 1 bảng để đánh index data kiểu này:

CREATE TABLE IF NOT EXISTS ezy_data_indices (
    id bigint unsigned NOT NULL AUTO_INCREMENT,
    data_type varchar(120) COLLATE utf8mb4_unicode_520_ci NOT NULL,
    data_id bigint unsigned NOT NULL,
    keyword varchar(300) COLLATE utf8mb4_unicode_520_ci NOT NULL,
    priority int unsigned NOT NULL,
    created_at datetime NOT NULL,
    updated_at datetime NOT NULL,
    PRIMARY KEY (id),
    UNIQUE KEY key_data_type_id_keyword (data_type, data_id, keyword),
    INDEX index_data_type (data_type),
    INDEX index_data_id (data_id),
    INDEX index_keyword (keyword),
    INDEX index_priority (priority),
    INDEX index_created_at (created_at),
    INDEX index_updated_at (updated_at)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;

Sau đó em có thể select:

select data_id from ezy_data_indices where data_type = ? and keyword in keyword_list

Độ chính xác của kiểu này sẽ phụ thuộc nhiều vào việc em tách từ và đánh index dữ liệu của em chi tiết đến mức nào.

  • 0
  • Reply