Saturday, April 26, 2014

Hướng dẫn cài đặt và config Solr 4.7.2 để import và search với data từ MySQL

Sau một buổi chiều ngồi mày mò các tài liệu hướng dẫn cài đặt và import data từ MySQL vào solr, thì đây là kết quả


Với SOLR, bạn có một công cụ để thực hiện fulltextsearch trên file, doc, excel, xml, pdf, và từ các cơ sở dữ liệu (oracleDB, MySQL)....

Khá là dễ để setup và config SOLR, tuy nhiên các tài liệu hướng dẫn trên mang thường không đầy đủ và có nhiều chỗ không chính xác! Với những người mới bắt đầu thì đây quả là là một vấn đề lớn!

Sau đây tôi sẽ hướng dẫn cách cài đặt, import dữ liệu để index và thực hiện fulltextsearch với solr.

Trước khi cài đặt solr, bạn phải chắc chắn trên máy mình có cài
Bước 1. Cài đặt solr 

Bạn có thể download bản cài đặt của Solr từ địa chỉ  http://lucene.apache.org/solr/downloads.html

Phiên bản hiện tại mà tôi đang sử dụng là 4.7.2

Sau khi download bản solr 4.7.2 (kích thước khoảng 150MB) vể bạn cần giải nén nó vào một thư mục bất kỳ trên máy


Ví dụ ở đây là ổ đĩa C:\

Để chạy solr bạn chỉ cần vào thư mục C:\solr-4.7.2\example và chạy file start.jar

Trên windows, để cho đơn giản, bạn có thể tạo file run.bat với nội dung sau
java -jar start.jar 
Khi chạy file run.bat ở trên, solr sẽ được khỏi động và chạy


Bạn có thể tương tác với solr qua giao diện web tại địa chỉ  http://localhost:8983/solr

Solr chạy, nhưng chưa có dữ liệu nên bạn chưa thể truy vấn được.

Tiếp theo chúng ta sẽ viết một data import handler để nhập dữ liệu từ MySQL

Để tắt solr bạn ấn Ctrl+C và chọn Y

Bước 2. Import data từ MySql

Bạn cần có

  1. MySQL được cài sẵn vào máy (nếu chưa có bạn có thể tải về bản Community server từ http://dev.mysql.com/downloads/mysql/)
  2. Một cơ sở dữ liệu có dữ liệu trong MySQL (bạn có thể tự tạo bằng tay hoặc import từ đâu đó để thử)
  3. Thư viện J connector để giúp solr có thể đọc dữ liệu từ MySQL (thường có sẵn nếu bạn cài cùng MySQL server, bạn có thể tải riêng từ http://dev.mysql.com/downloads/connector/j/)
Đầu tiên ta cần tổ chức lại các thư viện cần thiết cho solr 
  • Tạo một thư mục lib trong thư mục solr (C:\solr-4.7.2\example\solr\lib)
  • Copy toàn bộ các thư viện trong thư mục C:\solr-4.7.2\dist vào thư mục mới tạo này C:\solr-4.7.2\example\solr\lib)
  • Copy toàn bộ các thư viện trong thư mục C:\solr-4.7.2\example\lib vào C:\solr-4.7.2\example\solr\lib
  • Tiếp theo bạn copy thư viện J connector (tên là mysql-connector-java-5.x.xx-bin.jar, tùy theo phiên bản MySQL hiện có) vào thư mục C:\solr-4.7.2\example\solr\lib
Kết quả ta được

Tiếp theo ta sẽ import data từ MySQL vào core mặc định là collection1



1. Vào thư mục C:\solr-4.7.2\example\solr\collection1\conf, tạo một file xml với tên data-import.xml có nội dung (CHÚ Ý CÁC DẤU CÁCH TRỐNG VÀ XUỐNG DÒNG PHẢI ĐÚNG)

<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
    <dataSource type="JdbcDataSource"
                  driver="com.mysql.jdbc.Driver"
                  url="jdbc:mysql://localhost/bloggerdata"
                  user="xxxxxx"
                  password="xxxxx"/>

    <document name="doc">
    
        <entity name="contentnews"
                  query="select * from contentnews WHERE posttitle is not null AND posttitle!=''"
                  deltaImportQuery="SELECT * FROM `contentnews` WHERE id='${dataimporter.delta.job_jobs_id}'"
          deltaQuery="SELECT id FROM `contentnews` WHERE modified > '${dataimporter.last_index_time}'">

            <field column="id" name="id" />
            <field column="posttitle" name="posttitle" />
            <field column="summary" name="summary" />
            <field column="posttags" name="posttags" />
        </entity>
        
    </document>
</dataConfig>
Trong ví dụ này dữ liệu sẽ được đọc từ cơ sở dữ liệu với tên là  bloggerdata, tham số kết nối tới cơ sở dữ liệu này được tùy chỉnh tại
user="xxxxxx"
password="xxxxx"/>
Dữ liệu sẽ được lấy tại bảng là contentnews , ta lấy ra 4 trường là id, posttitle, summary, posttags

2. Chỉnh sửa file solrconfig.xml trong thư mục trên ( C:\solr-4.7.2\example\solr\collection1\conf)

Thêm vào đoạn

<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
    <lst name="defaults">
      <str name="config">data-import.xml</str>
    </lst>
  </requestHandler>

3. Vào file schema.xml trong thư mục trên ( C:\solr-4.7.2\example\solr\collection1\conf) và chỉnh sửa

Thêm đoạn sau vào sau thẻ <fields>
<field name="id" type="string" indexed="true" stored="true" required="true"/>
    <field name="posttitle" type="string" indexed="true" stored="true" required="true"/>
<field name="summary" type="text_general" indexed="true" stored="true" required="true"/>
    <field name="posttags" type="string" indexed="true" stored="true" required="true"/>
    <dynamicField name="*" type="ignored" />



Và đoạn

<uniqueKey>id</uniqueKey>
   <defaultSearchField>posttitle</defaultSearchField>

ở bên ngoài thẻ <fields>



Chú ý:

  • Nếu có trường trùng tên (trong trường hợp này là trường id, ta cần loại bỏ trường bị trùng)
  • Các dấu chú thích là <!-- và --> (cần phải có đầy đủ, nếu không khi chạy sẽ bị lỗi)
Bước 3. Chạy lại solr để index dữ liệu

  • Click file run.bat ở trên để chạy SOLR (nếu bị lỗi bạn cần quay lại kiểm tra các bước ở trước)
  • Vào http://localhost:8983/solr/#/collection1/dataimport//dataimport và chạy full-import (chỉ cần chạy để index dữ liệu cho lần đầu tiên), các lần sau ta chỉ cần chạy delta-import để cập nhật thêm dữ liệu mới
  • Sau khi index xong, bạn có thể thực hiện tìm kiếm (tham khảo thêm cấu trúc lệnh truy vấn của solr)
    VD. http://localhost:8983/solr/collection1/select?q=summary:iphone&wt=json&indent=true
Các bạn có thể tham khảo thêm trong các tài liệu hướng dẫn của solr

No comments:

Post a Comment