it-swarm-vi.com

Cách thích hợp để sử dụng tìm kiếm fulltext của MySQL trên chuỗi từ khóa?

Tôi có một chuỗi từ khóa mà tôi muốn thực hiện tìm kiếm toàn văn.

Truy vấn tìm kiếm hiện tại trong mô hình như sau:

$jinput = JFactory::getApplication()->input;
    $keyword = $jinput->get('keyword', '', 'NULL');
    if($keyword!=''){
         $keyword = $db->Quote('%' . $db->escape($keyword, true) . '%');
            $query->where('( a.title LIKE '.$keyword.'  OR  a.features LIKE '.$keyword.'  OR  a.brand LIKE '.$keyword.' )');
    }

Tuy nhiên điều này trả về kết quả tìm kiếm rất kém. Ví dụ: chuỗi tìm kiếm Google Nexus 5 khớp, trong khi Google 5 Nexus không làm. Cách chính xác để chuyển đổi truy vấn này sang tìm kiếm toàn văn bản trong Joomla 3.3

3
user2097091

NB. mã này không được kiểm tra chỉ cần nhập vào trình duyệt để emptor caveat

Bước đầu tiên sẽ là kiểm tra cụm từ tìm kiếm cho khoảng trắng và sau đó explode() nó thành một array() có chứa từng chuỗi được phân tách bằng dấu cách. ví dụ.

$keywordArray = explode(" ", $keyword);

Nếu bạn chỉ muốn tìm nội dung có tất cả từ khóa trong đó, thì bạn cũng cần sử dụng AND chứ không phải là OR. Nhân tiện, cuộc gọi $db->quote() bạn đã tự động thực hiện escape() theo cách bạn đang sử dụng nó (Tôi không chắc liệu nó có phát hiện ra văn bản đã thoát trước đó với việc thoát thêm hay không không phải trong trường hợp của bạn).

Vì vậy, để xây dựng where của bạn, bạn có thể lặp qua mảng với một cái gì đó như:

if($keyword!=''){
    $keywordArray = explode(" ", $keyword);

    foreach ($keywordArray as $keyword)
    {
        $searchTerm = $db->Quote('%' . $keyword . '%');
        $query->where('( a.title LIKE '.$searchTerm.' AND a.title LIKE '.$searchTerm.' AND a.title LIKE '.$searchTerm.' )');
        $query->where('( a.features LIKE '.$searchTerm.' AND a.features LIKE '.$searchTerm.' AND a.features LIKE '.$searchTerm.' )');
        $query->where('( a.brand LIKE '.$searchTerm.' AND a.brand LIKE '.$searchTerm.' AND a.brand LIKE '.$searchTerm.' )');
    }
}

Phải nói rằng, đây có thể là một số tải nghiêm trọng trên MySQL, đó là cơ sở dữ liệu quan hệ sau khi tất cả không phải là một công cụ tìm kiếm. Bạn có thể muốn làm những việc như:

  1. Cung cấp cho người dùng tùy chọn để tìm kiếm chỉ trong một trong những cột đó
  2. Giới hạn số lượng từ trên đầu vào, hãy tưởng tượng một tìm kiếm có từ 10 từ trở lên.
  3. Nhìn vào các tùy chọn như MATCHMATCH AGAINST
1
Craig

Tôi đang đối mặt với cùng một vấn đề đặc biệt là khi bạn có bộ dữ liệu lớn. Tôi cũng đã thử các giải pháp MATCH và MATCH AGAINST nhưng chúng không thực sự hữu ích cho tìm kiếm toàn văn. Cuối cùng, tôi đã tự viết plugin Finder và di chuyển các tiện ích mở rộng của mình để tìm kiếm toàn văn bản để sử dụng tìm kiếm thông minh . Không biết đây có phải là một lựa chọn cho bạn không.

1
Laoneo