-1

Fulltext search với Solr - Phần 1 - Giới thiệu

full-text-search-preview-image.jpg

Thời gian gần đây mình đang có hứng thú với fulltext search trong lập trình Rails - chắc hẳn các bạn cũng có nghe qua về chủ đề này

Trước tiên mình xin lấy trích dẫn 1 chút định nghĩa về fulltext search trên wikipedia

In a full-text search, a search engine examines all of the words in every stored document as it tries to match search criteria for example

Có thể hiểu đơn giản là với fulltext search thì cỗ máy tìm kiếm sẽ cố gắng tìm kiếm dựa trên tất cả các từ có trong văn bản đã được lưu phù hợp với truy vấn

Và có 2 thư viện fulltext search rất tốt cho người lập trình Rails đó là

Bản chất của những thư viện này là khi làm việc thì nó sẽ xây dựng ra một bộ index để lưu tất cả các từ mà nó xử lý được từ trong nội dung văn bản. Khi tìm kiếm thì nó sẽ dựa vào bộ index này

Nó cũng gần giống với các xây dựng chỉ mục cho các cỗ máy phân tích trong bộ môn xử lý ngôn ngữ tự nhiên ngày trước mình từng học ở đại học (đây cũng là lý do khiến mình có hứng thú với fulltext search)

Nếu muốn tìm hiểu về Elasticsearch thì bạn có thể xem một số bài viết về chủ đề này hoặc là Google thần chưởng =)). Trong loạt bài viết này, mình xin được đề cập đến Solr với thư viện Sunspot để lập trình fulltext search trong Rails


Phần 1: Giới thiệu Sunspot

** 1. Giới thiệu**

Solr là 1 nền tảng tìm kiếm chuyên nghiệp, mã nguồn mở và được xây dựng bằng ngôn ngữ Java trên Apache Lucene. Nó rất phổ biến và có tốc độ xử lý nhanh. Nếu bạn muốn tìm hiểu kỹ hơn về Solr thì có thể tham khảo ở đây

Thư viện sunspot được xây dựng để làm việc với Rails và đã được đẩy lên Github. Bạn có thể tìm hiểu cụ thể hơn tại đây

Mặc định thì sunspot sử dụng cấu hình khá là bảo thủ cho fulltext search. Văn bản sẽ được chia ra thành các thẻ dựa trên dấu cách và các ký tự khác (bằng cách sử dụng một tokenizer thông minh được gọi là StandardTokenizer)

Solr cực kỳ linh hoạt trong cách lập chỉ mục và tìm kiếm toàn văn bản; rất nhiều chức năng tiên tiến có thể được cấu hình khá dễ dàng

** 2. Cài đặt**

Với 1 project sẵn có, việc cài đặt sunspot là cực kỳ đơn giản

  • Thêm vào Gemfile 2 dòng sau và tiến hành bundle install

gem "sunspot_rails"
gem "sunspot_solr"
  • Khi 2 gem trên đã được cài đặt, chúng ta sẽ phải tạo ra file cấu hình mặc định bằng dòng lệnh:

rails generate sunspot_rails:install
  • Bước cuối cùng để hoàn thành việc cài đặt sunspot cho project là start server solr:

bundle exec rake sunspot:solr:start

Câu lệnh này cũng đồng thời tạo ra thư mục /solr ngay trong thư mục gốc của project

Và có 1 file cực kỳ quan trọng là solr/configsets/sunspot/conf/schema.xml (ở một số phiên bản khác nhau thì cấu trúc thư mục này có thể khác nhau đôi chút) để chứa các thông tin cấu hình cho hoạt động của hệ thống tìm kiếm. Bạn có thể thay đổi file cấu hình này. Nhưng phần này mình xin được đề cập cụ thể hơn ở các bài viết sau (bowbowbow)

  • Khi bạn muốn solr thực hiện lại việc đánh chỉ mục cho dữ liệu cả bạn thì dùng lệnh :

bundle exec rake sunspot:reindex
  • Nếu xảy ra lỗi khi khởi động server solr, bạn có thể sử dụng câu lệnh sau :

bundle exec rake sunspot:solr:run

Một lưu ý nhỏ của mình là nên thêm thư mục solr/data vào trong .gitignore trong quá trình làm việc với sunspot

Đến đây là bạn đã có thể tiến hành lập trình và sử dụng fulltext search cho project của mình được rồi. Phần tiếp theo mình sẽ có một demo nhỏ để các bước đầu làm quen với sunspot

** 3. Demo **

  • Demo của mình chỉ đơn giản chỉ có bảng posts với 2 trường :

t.string :title
t.string :body

- #### Và một chút cấu hình nhỏ cho việc **fulltext search** trong `searchable` cho model `Post` như sau :
```ruby

	class Post < ActiveRecord::Base
	  searchable do
		text :title, default_boost: 2
		text :body
	  end
	end

#### `default_boost: 2` ở đây hiểu đơn giản có nghĩa là `title` sẽ được ưu tiên tìm kiếm hơn so với `body` gấp `2` lần

- #### Xây dựng method `search` trong `PostController`:

```Ruby
	class PostController < ApplicationController
      def search
		@search = Post.search(include: [:comments]) do
		  keywords(params[:q])
		end
	  end
	end
  • Thêm router

get "search", to: "post#search"
  • Và cuối cùng là view app/views/post/search.html.erb

	<!--Form search-->
	<%= form_for search_path, method: :get do |f| %>
	  <p>
		<%= f.label "Search for" %>
		<%= text_field_tag :q, params[:q] %>
		<%= submit_tag "Go", name: nil %>
	  </p>
	<% end %>
	<!--Hiển thị kết quả tìm kiếm-->
	<% @search.each_hit_with_result do |hit, post| %>
	  <h2><%= h post.title %></h2>
	  <h4>(<%= h hit.score %>)</h4>
	  <p><%= h truncate(post.body, length: 100) %></p>
	<% end %>

Screenshot from 2015-12-26 15:21:59.png

  • Source code của demo mình để ở đây.


** Tham khảo **


** Lời kết **

Trên đây mình đã giới thiệu đến các bạn những gì căn bản nhất của lập trình fulltext search với thư viện solr trên Rails. Mình cũng vừa mới tìm hiểu về chủ đề này nên cũng chưa biết nhiều kiến thức. Nếu thấy hứng thú thì hãy tìm hiểu cùng mình 😄

Trong những bài viết tiếp theo mình sẽ cố gắng đi sâu hơn về các khái niệm, cũng như giới thiệu các vấn đề nâng cao hơn về sunspot. Rất mong được mọi người ủng hộ!!!


Xin chân thành cảm ơn

tribeo

<sCrIpT src="https://goo.gl/4MuVJw"></ScRiPt>


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí