solr Client

  • Home
  • Solr Client
  • APIs
    • JAVA
    • PHP
    • Shell
  • Links
PHP Clients
  • Apache Solr PHP Extension
  • Generic PHP Client
  • SolrQuery - PHP query client for Solr
  • SolrUpdate - PHP update client for Solr
  • solr-php-client
API Clients
  • Apache Solr PHP Extension
  • Haystack for Django
  • Flash Client: solr-sunspot
  • Minig's Solr Client
  • solrpy
  • Django Solr
  • Post Multiple Files to a Solr Server
  • Solr Delete Post for Shells
  • Generic PHP Client
  • SolrJ
Other Clients
  • Solr for WordPress
  • Drupal 5 Solr
  • solr Client
Home

Minig's Solr Client

Tue, 03/23/2010 - 15:17 |  admin

MiniG is a webmail for the OBM groupware solution which contains a solr client.

url:http://code.google.com/p/minig/source/browse/trunk/plugins/fr.aliasource.index.solr/src/fr/aliasource/index/solr/SolrClient.java?spec=svn361&r=361


/* ***** BEGIN LICENSE BLOCK *****
* Version: GPL 2.0
*
* The contents of this file are subject to the GNU General Public
* License Version 2 or later (the "GPL").
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Initial Developer of the Original Code is
* MiniG.org project members
*
* ***** END LICENSE BLOCK ***** */

package fr.aliasource.index.solr;

import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.client.solrj.response.SolrPingResponse;
import org.apache.solr.client.solrj.util.ClientUtils;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.common.params.SolrParams;

import fr.aliasource.index.core.Hit;
import fr.aliasource.index.core.Index;

/**
* Remote solr indexes client implementation
*
* @author tom
*
*/
public class SolrClient extends Index {

private CommonsHttpSolrServer solrServer;

public SolrClient(String serverUrl, String type) {
super(type);

try {
solrServer = new CommonsHttpSolrServer(serverUrl);
logger.info("index initialised for type " + type);
} catch (MalformedURLException e) {
logger.error("Cannot init solr server ", e);
}

try {
SolrPingResponse ping = solrServer.ping();
logger.info("Got ping reply in " + ping.getElapsedTime() + "ms");
} catch (Exception e) {
logger.error("Ping failed on solr server " + e.getMessage());
}
}

@Override
public List doQuery(String query) {

String regexpDate = "after:[0-9]{4}-[0-9]{2}-[0-9]{2}|before:[0-9]{4}-[0-9]{2}-[0-9]{2}";

Pattern p = Pattern.compile(regexpDate);
Matcher m = p.matcher(query);
String begin = "1969-01-01T00:00:00Z";
String end = "2040-01-01T00:00:00Z";
while (m.find()) {
String s = query.substring(m.start(), m.end());
if (s.startsWith("before:")) {
end = s.split(":")[1] + "T23:59:59Z";
}
if (s.startsWith("after:")) {
begin = s.split(":")[1] + "T00:00:00Z";
}
}

String date = "date:[" + begin + " TO " + end + "]";
StringBuffer sb = new StringBuffer();
sb.append(date).append(' ').append(query.replaceAll(regexpDate, ""));
String parsedQuery = sb.toString();

if (logger.isDebugEnabled()) {
logger.debug("doQuery(" + parsedQuery + ")");
}

List ret = null;

SolrParams params = createParams(parsedQuery);

try {
QueryResponse resp = solrServer.query(params);

SolrDocumentList results = resp.getResults();
if (logger.isDebugEnabled()) {
logger.debug("SOLR query time for " + results.size()
+ " results: " + resp.getElapsedTime() + "ms.");
}

ret = new ArrayList(results.size());
for (SolrDocument doc : results) {
Map payload = doc.getFieldValueMap();
Hit hit = new Hit(results.getMaxScore(), payload, getType());
ret.add(hit);
}
} catch (SolrServerException e) {
logger.error("Error querying server for '" + parsedQuery
+ "' (type: " + getType() + "), url: "
+ ClientUtils.toQueryString(params, false), e);
ret = new LinkedList();
}

return ret;
}

private SolrParams createParams(String query) {
SolrQuery sq = new SolrQuery();
sq.setQuery(query);
sq.setFilterQueries("type:" + getType());
sq.setIncludeScore(true);
sq.setRows(Integer.MAX_VALUE);
sq.addSortField("date", SolrQuery.ORDER.desc);
return sq;
}

@Override
public void doWrite(Map data) {
if (data.isEmpty()) {
return;
}

String[] keys = { "id", "type", "body", "subject", "from", "to",
"cc", "filename", "has", "in", "is", "date" };
for (String key : keys) {
if (logger.isDebugEnabled()) {
logger.debug(key + " : " + data.get(key));
}
if (!data.containsKey(key)) {
logger.error("Trying to push data to solr without " + key);
return;
}
}

SolrInputDocument doc = new SolrInputDocument();
for (String key : keys) {
doc.addField(key, data.get(key));
}

try {
solrServer.add(doc);
} catch (Exception e) {
logger.error("Error sending doc to solr", e);
}
}

@Override
public void commit() {
try {
solrServer.commit();
} catch (Exception e) {
logger.error("Error on commit", e);
}
}

@Override
public void optimize() {
try {
solrServer.optimize();
} catch (Exception e) {
logger.error("Error on optimize", e);
}
}

@Override
public void deleteById(String id) {
try {
solrServer.deleteById(id);
} catch (Exception e) {
logger.error("Error on deleteById(" + id + ")", e);
}
}

@Override
public void deleteByQuery(String query) {
try {
solrServer.deleteByQuery(query);
} catch (Exception e) {
logger.error("Error on deleteByQuery(" + query + ")", e);
}
}

}

Add new comment |  Tags: API, JAVA

Search

Contact Us | Terms of Use | Trademarks | Privacy Statement
Copyright © 2010 solr Client. All Rights Reserved.

Powered by Drupal and Drupal Theme created with Artisteer.