Article:
Đút XML cho Sphinx từ Erlang
1085
ngocdaothanh.myopenid.com 172Updated over 2 years ago |
Sphinx là search engine tốc độ cao có tiếng hiện nay. Một số trang web lớn của Việt Nam như RồngBay.com đã sử dụng thành công Sphinx. Trước đây Sphinx chỉ hỗ trợ SQL DB như MySQL và PostgreSQL, từ phiên bản 0.9.9-rc2 trở đi Sphinx hỗ trợ thêm XML, giúp Sphinx mở rộng thị trường ra rất nhiều. Tiếp theo bài viết về làm từ điển và search CJK, bài viết này trình bày cách đút XML từ chương trình Erlang cho Sphinx (ví dụ dữ liệu lấy từ Mnesia), thông qua đó trình bày cách tạo XML từ Erlang. Để hiểu, cần biết sơ sơ Erlang và đọc qua ít nhất một lần tài liệu của Sphinx.

sphinx.conf
Sphinx cung cấp 3 chương trình:
- indexer: để tạo chỉ mục từ dữ liệu có cấu trúc. Mỗi đơn vị dữ liệu đều có ID. Chỉ mục có thể hiểu đơn giản là vector trỏ từ text trong dữ liệu sang ID.
- searchd: chính là search engine. Nó dựa vào các chỉ mục tạo bởi indexer và keyword cần search để trả về ID.
- search: chương trình search từ dòng lệnh, chủ yếu dùng để thử nghiệm chỉ mục tạo bởi indexer.
Cả 3 đều dựa vào cùng tập tin cấu hình sphinx.conf để hoạt động. Ví dụ:
source content
{
type = xmlpipe2
xmlpipe_command = erl -noshell -pa ebin -mnesia dir mnesia -s m_content sphinx_xml -s init stop
xmlpipe_fixup_utf8 = 1
}
index content
{
source = content
path = sphinx/content
charset_type = utf-8
html_strip = 1
}
indexer
{
mem_limit = 64M
}
searchd
{
listen = 3312
log = log/sphinx_searchd.log
query_log = log/sphinx_query.log
pid_file = log/sphinx_searchd.pid
read_timeout = 5
max_children = 30
max_matches = 1000
seamless_rotate = 1
preopen_indexes = 0
unlink_old = 1
}
Trong cấu hình trên quan trọng nhất là xmlpipe_command. Đây chính là lệnh indexer sẽ gọi khi muốn lấy dữ liệu XML để tạo chỉ mục. Lệnh này cần xuất XML theo qui định của Sphinx ra standard out.
Xuất XML từ chương trình Erlang
Có 2 cách. Đơn giản nhất là nối chuỗi, vì XML bản chất cũng chỉ là chuỗi kí tự bình thường. Cách khác giúp escape tự động, đảm bảo cấu trúc XML v.v. là dùng thư viện như xmerl.
Kết nối với searchd từ Erlang
Hiện Erlang có thư viện giza rất dễ dùng. Từ phiên bản 0.9.9-rc2 Sphinx hỗ trợ thêm giao thức MySQL, có thể dùng bất kì driver MySQL nào để kết nối với searchd.
172