Januari 28, 2011

Membuat Lucene WebScripts API untuk Pencarian pada Alfresco

Posted in Java, komputer tagged pada 10:03 am oleh fuad

Beberapa waktu yang lalu saya mendapatkan proyek dari perusahaan untuk membuat Document Management System (DMS), bukan full featured DMS tapi lebih kepada penyimpanan dokumen-dokumen digital agar selanjutnya dapat dicari dengan mudah. Setelah mereview beberapa produk DMS yang Open Source akhirnya pilihan jatuh kepada Alfresco.

Alfresco cukup powerful untuk kebutuhan perusahaan saat itu, yang paling saya sukai adalah kita bisa mengakses nya dengan banyak cara via interface Web, CIFS, WebDAV, dan Web API.  Karena bisa menggunakan Web API, akhirnya kami menggunakan Alfresco di beberapa proyek pengembangan aplikasi berikutnya untuk menyimpan dokumen-dokumen yang diupload.

Tapi ada satu yang mengganjal pada Alfresco versi 3.3 g (versi terbaru saat proyek), yaitu interface web nya belum support pencarian dokumen menggunakan metadata custom (metadata yang didefinisikan sendiri).  Misalnya pada kasus dokumen SCM (Supply  Chain Management)/Pengadaan, biasanya untuk dokumen ini kita perlu menambahkan custom metadata nomor PO (Purchase Order) .  Untuk mengatasi hal ini kami membuat aplikasi web yang menggunakan Alfresco Rest API  untuk melakukan pencarian.

Untuk melakukan pencarian via REST API, Alfresco memiliki beberapa opsi yaitu menggunakan Alfresco keyword search /org/alfresco/repository/search, CMIS Query, atau Lucene Search. Pilihan pertama tidak digunakan karena tidak support jika mencari dokumen dengan custom metadata, sepertinya code base nya sama dengan yang digunakan di interface web. Awalnya kami menggunakan CMIS Query tetapi  performa nya tidak memuaskan (super lambat). Akhirnya terpaksa menggunakan Lucene Search.

Untuk Lucene Search ini Alfresco tidak menyediakan akses via Rest API, tetapi hanya menyediakan melalui Javascript API.  Untungnya Alfresco menyediakan cara untuk mengakses Javascript API melalui Rest API menggunakan fasilitas webscripts.

Dalam pembuatan webscripts ini ada beberapa file yang mesti dibuat yaitu file deskriptor yaitu file yang berfungsi mendefinisikan web script yang dibuat, berikut file deskriptor lucene search yang kami buat:

<webscript>
<shortname>Simple Search</shortname>
<description>PEP DMS Simple Search</description>
<url>/pep/dmssearch?q={query}</url>
<format default="json">argument</format>
<authentication>user</authentication>
<transaction>required</transaction>
</webscript>

Selanjutnya adalah mendefinisikan scripts yang akan mengambil data dari Alfresco, berikut kode nya

model.query = args['q'];
var paging =
{
	maxItems: args['max'],
	skipCount: args['skip']
}
var results = search.query(
	{
		query: args['q'],
		page: paging,
	});
model.results = results;

Pada kode di atas method search.query pada Javacript API menerima parameter yang berupa objek. Objek ini berisi query, yang harus menggunakan query lucene, dan page yang diberikan parameter objek paging, yang berisi maxItems yaitu jumlah maksimum dokumen yang akan diambil dan skipCount yaitu berapa banyak dokumen yang akan diabaikan ketika mengambil dokumen.

Untuk mengambil paramater GET yang dipassing menggunakan array args pada contoh di atas berarti saya nantinya akan memasukkan variabel via argumen q, max, dan skip.

Agar bisa ditampikan ke dalam template, variabel harus dimasukkan sebagai atribut pada objek model. Pada contoh di atas yaitu model.query dan model.results. Artinya nanti di dalam template kita akan memiliki variabel query dan results.

Selanjutnya adalah template webscripts, berikut kodenya

[
 <#list results as document>
  {
   <#assign props = document.properties?keys>
   <#list props as t>
       <#if document.properties[t]?exists>
             <#if document.properties[t]?is_date>
                "${t}":"${document.properties[t]?date}"
              <#elseif document.properties[t]?is_boolean>
                 "${t}":"${document.properties[t]?string("yes", "no")}"
	      <#elseif document.properties[t]?is_sequence>
		  "${t}":"${document.properties[t]?first}"
                <#else>
                  "${t}": "${document.properties[t]?j_string}"
                 </#if>
                 <#if t_has_next>, </#if>
        </#if>
    </#list>
}
<#if document_has_next>, </#if>
</#list>

] 

Pada template webscripts, kode yang digunakan adalah freemarker. Kode-kode di atas dimasukkan ke folder /shared/classes/alfresco/extension/templates/webscripts/com/company

Berikut contoh cara mengakses webscripts diatas
http://localhost:8080/alfresco/service/pep/dmssearch?q=(@scm\:PrDocNoPoManual:*123*)&max=2&skip=1
Pada contoh ini Query Lucene yang digunakan adalah @scm\:PrDocNoPoManual yang merupakan custom metadata

2 Komentar »

  1. Makasih nih caranya ya Kawan
    Salam Kenal :)

  2. SeaGate said,

    Wah, senangnya bisa maen2 pake Lucene


Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: