jQueryでsolrクライアントを書いてみる

facetとhighlightに対応(Solr 1.3前提)。


<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<style type="text/css">
.facet {
  width: 200px;
  margin: 10px;
  float: left;
}
#category {
  background-color: #ccc;
  width: 200px;
  height: 480px;
}
.doc {
  background-color: #eee;
  width: 520px;
  margin: 10px;
  font-size: 12px;
  float: left;
}

em {
  font-weight: bold;
}
</style>

<script type="text/javascript" src="jquery-1.2.6.js"></script>
<script type="text/javascript">
<!--

var query = "";

function getUrl(q){
  var url = 
  "http://localhost:8080/solr/select?" +
  "indent=on" +
  "&version=2.2" +
  "&q=" + q +
  "&start=0" +
  "&rows=10" +
  "&fl=*%2Cscore" +
  "&qt=standard" +
  "&wt=json" +
  "&json.wrf=?" +
  "&explainOther=" +
  "&hl=true" +
  "&hl.fl=text" +
  "&hl.usePhraseHighlighter=true" +
  "&facet=true" +
  "&facet.field=category";
  return url;
}

function view(url){
  $.ajax({
    url : url,
    dataType : "jsonp",
    data : {},
    success : function(data){
      var facet = "<select id=\"category\" size=\"2\">\n";
      var category = data.facet_counts.facet_fields.category;
      for(i = 0; i < category.length / 2; i++){
        if(category[ i * 2 + 1] == 0) break;
        facet += "<option value=\""
              + category[i * 2] + "\">" 
              + category[i * 2]
              + "(" + category[i * 2 + 1] + ")</option>\n";
      }
      facet += "</select>";
      var doc = "numFound : " + data.response.numFound + "<br/>";
      var docs = data.response.docs;
      for(i = 0; i < docs.length; i++){
        doc += "<h3>" + docs[i].title + "</h3>\n";
        var id = docs[i].id;
        if(data.highlighting[id]['text']){
          var highlight = data.highlighting[id]['text'].join("<br/>\n");
          doc += highlight;
        } else {
          doc += "<p>" + docs[i].text + "</p>\n";
        }
      }
      $(".facet").empty().append(facet);
      $(".doc")
      .css("height","480px")
      .css("padding","4px")
      .css("overflow","scroll")
      .empty().append(doc);
      $("#category").change(function(){
        var c = $(this).attr("value");
        query = "category:" + c + " AND " + query;
        var url = getUrl(query);
        view(url);
      });
    },
    error : function(){alert("error")}
  });
}

$(document).ready(function(){
  $("#f").submit(function(){
    var q = $("#q").attr("value");
    query = "(title:" + q + "^2.0 OR text:" + q + ")";
    var url = getUrl(query);
    view(url);
    return false;
  });
});
//-->
</script>
</head>
<body>

<form id="f">
<input type="text" id="q" />
<input type="submit" value="Search" />
</form>

<div class="facet"></div>

<div class="doc"></div>

</body>
</html>

schema.xml(抜粋)

<types>
    <fieldtype name="text_ja" class="solr.TextField" >
      <analyzer class="org.apache.lucene.analysis.cjk.CJKAnalyzer" />
    </fieldtype>
</types>
<fields>
   <field name="id" type="sint" indexed="true" stored="true"/>
   <field name="title" type="text_ja" indexed="true" stored="true" />
   <field name="text" type="text_ja" indexed="true" stored="true" />
   <field name="category" type="string" indexed="true" stored="true" multiValued="true" />
</fields>