10/10/2018, 10:44

Tìm kiếm dữ liệu trong php và Mysql

Tớ có vấn đề này muốn hỏi các bạn?
Tớ có muộn đoạn văn "Hôm nay là ngày 20 tháng 10 năm 2007, ..."
Giờ tớ muốn tìm kiếm đoạn văn này với thứ tự ưu tiên như sau:
1. cả đoạn
2. từng từ
3. cụm từ do người sử dụng áp đặt ( ví dụ "Hôm nay" là ngày 20 tháng 10 năm 2007, ..) nghĩa là trong đoạn văn của một trường nào phải có nguyên 1 cụm từ Hôm nay và các từ kia có thể nằm đâu đó trong đoạn văn. Dạng như google vậy
Bác nào biết chỉ tớ nhá
Thanks
gaulucky92 viết 12:46 ngày 10/10/2018
Cái phần cả đoạn thì mình biết làm còn 2 cái kia thì chịu.. mới nghĩ loáng thoáng trong đầu đã chóng mặt rồi ... nghĩ sâu nữa chắc điên
Loại cả đoạn thì chỉ cần chạy query sau:
Code:
SELECT * FROM `post` WHERE content = "%$keyword%"
Với `post` là tên table của bạn, content là field chứa nội dung bài viết và $keyword là từ khóa tìm kiếm mà người dùng ghi vào ( trước đó cần đặt $keyword = $_GET['keyword']; để gán dữ liệu nhập vào từ form search cho biến $keyword. )
Code đơn giản thế này:
Cho đoạn code này nằm trong file search.php
Code:
<?php
$keyword = $_GET['keyword']
$searchquery = mysql_query("SELECT * FROM post WHERE content = \"%$keyword%\"") or die (mysql_error());
$count_result = mysql_num_rows($search_query);
if ($count_result == 0)
{
echo "Không tìm thấy <B>".$keyword."</B> trong tài liệu nào.";
}
else
{
echo "Bạn đang tìm <B>".$keyword."</B> và có <B>".$count_result."</B> kết quả được tìm thấy.";
while ($row = mysql_fetch_array($searchquery))
{
echo "<a href=\"index.php?act=viewpost&id=".$row['id']."\">".$row['title']."</a>";
}
}
?>
Đại loại là như thế có thể thêm thắt gì đấy tùy ý
Code hơi "cùi", có gì sai đừng trách tui nghe đang học PHP thôi ...
Hanaziki viết 13:00 ngày 10/10/2018
Ùm dùng fulltext hay nhất, kết quả trả về toàn diện hơn. Tuy nhiên việc dùn chức năng nầy ngốn nhiều tài nguyên máy ( khoảng 100K dòng là dể bị overload server lắm). Nên cân nhắc trước khi dùng.
Hiện nay trên mạng cũng có nhiều script giúp index site bác thành cơ sở dữ liệu để phục vụ cho việc search. Tuy nhiên để sử dụng hiệu quả đòi hỏi bác phải hiểu hiểu rõ script của site bác để nhứng vào cho nhiều quả.
3do viết 12:54 ngày 10/10/2018
tôi mới xem lại manual, fulltext không thể tìm đúng cụm từ "Hôm nay" được, nó chỉ có khả năng tìm từng từ 1 thôi. Nếu muốn làm kiểu google mà yêu cầu php + mysql thì hơi mệt.

Nếu bỏ qua yêu cầu php, bạn có thể nghĩ đến lucene
gaulucky92 viết 12:56 ngày 10/10/2018
Ôi dào ! Xài google cho tiện làm search riêng chi cho mệt phải lọc nội dung, rồi check hết nội dung , blah blah blah , ... chưa kể phải loại bỏ mấy cái tag HTML để tìm kiếm chính xác nữa... sơ sơ thấy code dài dài ==> nhức đầu!
Còn nếu bạn siêng muốn tự viết thì gợi ý vài hàm để dùng trong tìm kiếm:
strip_tags : loại bỏ tag HTML
substr : ngắt bớt nội dung (VD: đoạn văn của bạn 100 dòng, nội dung tìm kiếm nằm ở khoảng dòng thứ 50, thì với substr nó sẽ giúp hiển thị các dòng từ 48->52 trong đoạn văn thôi, giống như google đó )
... còn nhiều hàm nữa bạn tự khám phá đi. thực ra trong quá trình làm chắc chắn gặp nhiều rắc rối , tự khắc sẽ tìm kiếm cách giải quyết, thế là mấy cái hàm được "moi" ra...
3do viết 12:48 ngày 10/10/2018
zend framework có bộ zend search lucene. Nếu dùng nó để index thì có thể search giống google
newone668 viết 12:49 ngày 10/10/2018
Thưa bác gấu lucky em đang muốn làm cho việc tìm kiếm trong cơ sở dữ liệu của mình chứ không phải google. Chỉ cần làm đại loại như thế.
Đối với việc tìm kiếm dạng LIKE %query% thì ngon rồi các bác ạ. Chỉ giờ làm thế nào để nó nhận dạng một cụm từ trong "abcd" thôi. Dùng fulltextsearch tuy hay nhưng là dở lắm. Máy chủ còi chơi cái anh này nó gặm ngất luôn.
Các bác có thuật toán nào chỉ cho em với. Thx
Thanh duc viết 12:55 ngày 10/10/2018
Tôi nghĩ bạn có thể giải quyết như sau:
Tách chuỗi "hôm nay" ra khỏi chuỗi từ khóa
Thêm vào câu lệnh select như sau
PHP Code:
SELECT FROM table WHERE content LIKE '%hôm nay%' AND content LIKE 'Hôm nay là ngày 20 tháng 10 năm 2007, ...' 
gaulucky92 viết 12:44 ngày 10/10/2018
Ô hô hay nhỉ code là lạ... :P nếu vậy phì phải nhận dạng keyword... chắc dùng str_replace() sửa dấu " thành % rồi nhét vào query...
NetBuiDoi viết 12:50 ngày 10/10/2018
Được gửi bởi newone668
1. cả đoạn
... thì dễ rồi, bạn kia đã có chỉ
2. từng từ
dùng explode để tách ra:

$array = explode(" ", $searchString);

dùm implode để ghép thành sql-query:

$query = "colname='".implode("' OR colname='", $array)."'";
$query = "select ... from ... where ".$query;

3. cụm từ do người sử dụng áp đặt ( ví dụ "Hôm nay" là ngày 20 tháng 10 năm 2007, ..) nghĩa là trong đoạn văn của một trường nào phải có nguyên 1 cụm từ Hôm nay và các từ kia có thể nằm đâu đó trong đoạn văn. Dạng như google vậy
cái này rắc rối hơn 1 chút, dùng RegEx lấy phần trong ngoặc kép:

$pattern = '&"(.*)"&isU';
$result = preg_match_all($pattern, $searchString, $subpattern);

kế đó dùng str_replace để xoá hết mấy phần trong ngoặc kép của $searchString rồi làm như phần 2. sau đó ghép kếp quả tìm được trong RegEx thêm vô là xong

Mến.

À quên, khi xài RegEx thì kiếm delimiter nào mà không có trong text nhe
Bài liên quan
0