Dear Wiki user, You have subscribed to a wiki page or wiki category on "Solr Wiki" for change notification.
The following page has been changed by MatthiasEpheser: http://wiki.apache.org/solr/SolrJS New page: = SolrJs = == About == SolrJs is a javascript client library that is topic of a 2008 google summer of code project. It is currently work in progress, this page is intended to show the project's status, some technical documentation and a collection of thoughts about future features. The current trunk is accessible at [http://solrstuff.org/svn/solrjs/trunk] == Architectural Overview == The library is written using the javascript toolkit jQuery [http://jquery.com/] (Version 1.2.5). SolrJS is included in one additional javascript file "solrjs.js" The idea is to create several (reusable and extensible) "widgets" that represent solr queries. A widget is a javascript object that is responsible for creating the according solr query as well as render the result from the server to html. One manager object acts as a container that holds these widgets, performs the actual query using jQueries getJSON [http://docs.jquery.com/Ajax/jQuery.getJSON#urldatacallback] method. This method creates a dynamic script tag, making cross-domain solr requests possible. === Examples for widgets === * Result widget: displaying a pageable view of the current result. * Facet widget: Create a faceted selection menu for one field in the solr document == Implementation == === Javascript matters === All SolrJS objects are created inside the jQuery.solrjs namspace. Given JQueries support for overriding the $() function, it is easily possible to use SolrJS alongside other javascript toolkits like prototype or custom javascript code. Just include the following includes in the header section of your html: {{{ <script src="jquery-1.2.5.js"/> <script src="solrjs.js"/> <script> var $sj = jQuery.noConflict(); </script> }}} After that, all objects are accessible using $sj.solrjs.* === The manager object === The manager object acts as "Controller" for the user input. It holds a state of the current solr query. The current query is represented by QueryItems objetcs. A query item simply is a field:value pair. A user may select or deselect multiple items. In the current work in progress, all query itemsa are concatinated using "AND" operators. More complex query generation may be implemented in the future. The manager currently provides the following methods: * addWidget: add a new widget * addQueryItems: add a list of field:value pairs that restrict the current query * removeQueryItems: remove the given items from the current query * doRequest(start): performs the actual solr requests ==== How a query request works ==== Every widget implements a "getSolrUrl" method and performs its own http request. It also has to provide a "handleResult" method that gets the json data response to render. So if a user changes the selection: * manager.doRequest(startindex) is called * a q=... parameter is created by the manager according to the current selection * the call is delegated to all the widgets. They may extend the query url in the getSolrUrl method (eg. adding facet=true..) and then make the http call to solr. * json data is returned to the widget and widget.handleResponse(data) is called. === Widget Inheritance === A main goal of the implementation was to create clean easy to understand code that can be easily extended by other developers. So I introduced a small OO inheritance pattern inspired by this thread [http://groups.google.com/group/jquery-dev/msg/12d01b62c2f30671] and created the factory method: jQuery.solrjs.createClass = function(subClassName, baseClassName, subClass) An "AbstractWidget" class is provided that acts as base class for all further widget implementations. In the source code, all methods that should be implemented by the child class are documented and marked as "abstract methods". An example syntax for a simple widget may be: {{{ /* * Simple faceted view for one field. * * @param "id": the widgetId * @param "target": the target html element in jquery notation * @param "fieldName": The facet field name */ jQuery.solrjs.createClass ("SimpleFacetWidget", "AbstractWidget", { getSolrUrl : function(start) { return "&facet=true&facet.field=" + this.fieldName; }, handleResult : function(data) { var values = data.facet_counts.facet_fields[this.fieldName]; jQuery(this.target).html(""); for (var i = 0; i < values.length; i = i + 2) { var items = "[new jQuery.solrjs.QueryItem({field:'" + this.fieldName + "',value:'" + values[i] + "'})]"; var label = values[i] + "(" + values[i+1] + ")"; jQuery('<a/>').html(label).attr("href","javascript:solrjsManager.selectItems('" + this.id + "'," + items + ")").appendTo(this.target); jQuery('<br/>').appendTo(this.target); } }, handleSelect : function(data) { jQuery(this.target).html(this.selectedItems[0].value); jQuery('<a/>').html("(x)").attr("href","javascript:solrjsManager.deselectItems('" + this.id + "')").appendTo(this.target); }, handleDeselect : function(data) { // do nothing } }); }}} To add this widget to your html page, just create this script tag: {{{ <script> var solrjsManager; $sj(document).ready(function(){ solrjsManager = new $sj.solrjs.Manager({solrUrl:"http://localhost:8983/solr/select"}); solrjsManager.addWidget(new $sj.solrjs.SimpleResultWidget({id:"result", target:"#result", rows:20})); solrjsManager.addWidget(new $sj.solrjs.SimpleFacetWidget({id:"cat", target:"#cat", fieldName:"cat"})); solrjsManager.doRequestAll(); }); </script> }}}
