04 tháng 7 2012

PHP Zend search lucene tiếng việt Unicode

 

PHP zend search lucene tiếng Việt Unicode

I/ Search lucene ?

Mô hình search giống như dữ liệu chính xác (có thể gần giống như google) hay giống như full-text search. Search lucene đã có những phiên bản hỗ trợ với nhiều ngôn ngữ khác nhau. Java, .Net, .PHP các bạn có thể thao khảo thêm trên http://lucene.apache.org/ hoặc trên wiki http://vi.wikipedia.org/wiki/Lucene,…vv


II/ PHP search lucene

Ở đây tôi dùng thư viện zend_search_lucene, đã hỗ trợ Unicode tiếng Việt khá tốt.
Cũng như các ngôn ngữ khác zend search lucene gỗm có 2 phần
1/ Phần index (công việc phân tích đánh dấu chỉ mục tài liệu)
2/ Phần search (công việc tìm kiếm trên các file dữ liệu mà bạn đã phân tích ở phần 1)

III/ Hướng dẫn cách sử dụng zend search lucene

Các bạn download thư viện zend trên trang của zend, hiện tại tôi đang dùng zend framework version 1.10.5 http://framework.zend.com/download/webservices

Nếu project của bạn sử dụng zend framework thì không cần bàn thêm, ngược lại nếu bạn sử dụng framework khác thì bạn tìm cách load thư viện zend phù hợp với framework mà bạn đang dùng, và bạn cũng có thể bỏ bớt một số libraries không cần thiết (Acl, Amf, Cloud, CodeGenerator, Console, ..vv). Nhưng nhớ phải giữ lại các libraries liên quan zend_search_luene (Application, Controller, Date, Feed, File, Loader, Locale, Memory, Mime, Search, Server, Service, Soap, Text) Còn lại có xóa bỏ bớt cho cho nhẹ host.

1/ Phần 1 index
Ví dụ:


$arr_data = array() // là dữ liệu bạn cần index để sử dụng cho phần 2 ‘searching’. Bạn có thể lấy từ CSDL MySQL.


$lucene_index_path = ‘c:\xampp\htdocs\my_project\lucene_index'; (Window & Xampp)
//$lucene_index_path = ‘/var/home/my_project/lucene_index'; (Host linux)


$index = new Zend_Search_Lucene($lucene_index_path, true);
Zend_Search_Lucene_Analysis_Analyzer::setDefault(new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8_CaseInsensitive());


foreach($arr_data as $test) {
//create an cache index doc
$doc = new Zend_Search_Lucene_Document();
$doc->addField(Zend_Search_Lucene_Field::Keyword('prId', $test->prId, 'UTF-8'));
$doc->addField(Zend_Search_Lucene_Field::Text('products', $test->products, 'UTF-8'));
$doc->addField(Zend_Search_Lucene_Field::Text('product_desc', $test->product_desc, 'UTF-8'));
$doc->addField(Zend_Search_Lucene_Field::Keyword('lastUpdate', $test->lastUpdate, 'UTF-8'));


$index->addDocument($doc);
}


$index->commit();
$index->optimize();
echo $index->count().' Documents indexed.';

Tại sao lại dùng Keywor, Text, … các bạn tham khảo table bên dưới:

Field Type
Stored
Indexed
Tokenized
Binary
Keyword
yes
yes
no
no

UnIndexed
yes
no
no
no

Binary
yes
no
no
yes

Text
yes
yes
yes
no

UnStored
no
yes
yes
no


Hoặc xem ở thêm tại Link sau: http://darksleep.com/lucene/,

- $test->lastUpdate: là dự liệu kiểu số tôi tính toán từ cơ sở dữ liệu MySQL
// SELECT DATEDIFF(CURRENT_DATE(), product_date_add) AS lastUpdate FROM products,
Tôi thêm lastUpdate để làm ví dụ sort cho zend lucene search ở phần 2 (searching)

2/ Phần 2 searching
Ví dụ:

$lucene_index_path = ‘c:\xampp\htdocs\my_project\lucene_index'; (Window & Xampp)
//$lucene_index_path = ‘/var/home/my_project/lucene_index'; (Host linux)


Zend_Search_Lucene_Analysis_Analyzer::setDefault(new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num_CaseInsensitive());
Zend_Search_Lucene_Search_QueryParser::setDefaultEncoding('UTF-8');
$index = Zend_Search_Lucene::open($lucene_index_path);


$query = ‘products: Sản phẩm’;


$hits = $index->find($query, 'lastUpdate', SORT_NUMERIC, SORT_ASC);
$totals = count($hits); //total rows


foreach ($hits as $hit){
print_r($hit);
//echo $hit->prId;
//$hit->products;
//$hit->product_desc;
//$hit->lateUpdate;
}

Có một vấn đề không biết có phải host share bị giới hạn execute_time. Nếu dữ liệu tìm thấy quá lớn thì zend_search_lucene không thể chạy. Trường hợp này bạn phải sử dụng thêm chức năng giới hạn.

setResultSetLimit // đặt set limit ngay sau khi lệnh Open

Zend_Search_Lucene::open(‘’);
Zend_Search_Lucene::setResultSetLimit(350);


nhantam
PHP Developer



tag: php search lucene, zend lucene search, thuat toan tim kiem

Lời dịch Take me to your heart của Michael Learns To Rock


Hiding from the rain and snow
Trying to forget but I won't let go
Looking at a crowded street
Listening to my own heart beat
So many people all around the world
Tell me where do I find someone like you gir
Take me to your heart
Take me to your soul
Give me your hand before I'm old
Show me what love is
Haven't got a clue
Show me that wonders can be true
They say nothing lasts forever
We're only here today
Love is now or never
Bring me far away
Take me to your heart
Take me to your soul
Give me your hand and hold me
Show me what love is
Be my guiding star
It's easy
Take me to your heart
...
Standing on a mountain high
Looking at the moon through a clear blue sky
I should go and see some friends
But they don't really comprehend
Don't need too much talking
Without saying anything
All I need is someone
Who makes me want to sing
Take me to your heart
Take me to your soul
Give me your hand before I'm old
Show me what love is
Haven't got a clue
Show me that wonders can be true
They say nothing lasts forever
We're only here today
Love is now or never
Bring me far away
Take me to your heart
Take me to your soul
Give me your hand and hold me
Show me what love is
Be my guiding star
It's easy
Take me to your heart
Take me to your heart
Take me to your soul
Give me your hand and hold me
Show me what love is
Be my guiding star
It's easy
Take me to your heart

Đang lẫn tránh những cơn mưa tuyết
đang cố quên đi nhưng lại không muốn cho qua
Ngắm nhìn vào đường phố đông đúc
Đang lắng nghe nhịp tim mình đang đập

Có thật là nhiều người _ khắp nơi trên thế giới
Nói anh biết tìm đâu ra
một cô gái như em?

(Điệp Khúc:)
Đem anh đến tim em đem anh đến hồn em
Cho anh tay em trước khi anh héo đi
Cho biết yêu là sao - anh không biết gì hết
Cho anh thấy thần tiên có thật được

Họ nói không gì bền lâu mãi mãi
Mình chỉ ở đây hôm nay
Yêu liền hoặc không bao giờ
Mang anh đi thật xa

Đem anh đến tim em đem anh đến hồn em
Đưa anh tay em và ôm anh
Cho biết yêu là sao - thắp đèn soi đường anh
Em chỉ cần đem anh vào trái tim em

Đang đứng trên một hòn núi cao
ngắm nhìn thấy ánh trăng trên bầu trời trong xanh
anh nên đi thăm mấy đứa bạn
nhưng họ không thật sự thấu hiểu được

không cần phải quá nhiều lời mà không có ý nghĩa gì cả
Anh chỉ cần người nào đó _ làm cho anh cất tiếng ca

(Điệp Khúc)

tag: lời dịch take me to your heart, những bài hát quốc tế hay, Michael Learns To Rock