选择json返回格式,默认是xml:
http://localhost:8983/solr/select?q=*:*&rows=1&wt=json
自定义request handler:
需要apache-solr-solrj-3.1.jar, apache-solr-core-3.1.jar, and lucene-core-3.1.jar
继承StandardRequestHandler:
public class ExampleRequestHandler extends StandardRequestHandler {
private static final Logger LOG = Logger.getLogger(
ExampleRequestHandler.class.toString() );
public void handleRequestBody(SolrQueryRequest request,
SolrQueryResponse response)
throws Exception {
super.handleRequestBody(request, response);
LOG.info( "[" + (response.getEndTime() - request.
getStartTime()) + "]:" + request.getParamString() );
}
}
注册RequestHandler:<requestHandler name="/test" class="pl.solr.ExampleRequestHandler" />
ExampleRequestHandler.class 添加到目录webapps/solr/WEB-INF/classes/pl/solr
自定义filter:
需要apache-solr-core-3.1.jar,lucene-analyzers-3.1.jar and lucene-core-3.1.jar
继承TokenFilter:
public class ExampleFilter extends TokenFilter {
private final TermAttribute termAttr = (TermAttribute)
addAttribute(TermAttribute.class);
public ExampleFilter(TokenStream stream) {
super(stream);
}
@Override
public boolean incrementToken() throws IOException {
if (input.incrementToken()) {
String term = termAttr.term();
if (term.length() <= 1) {
return true;
}
StringBuffer buffer = new StringBuffer();
buffer.append(term.charAt(1)).append(term.charAt(0)).
append(term.substring(2));
termAttr.setTermBuffer(buffer.toString());
termAttr.setTermLength(buffer.length());
return true;
}
return false;
}
}
继承BaseTokenFilterFactory:public class ExampleFilterFactory extends BaseTokenFilterFactory {
@Override
public TokenStream create(TokenStream stream) {
return new ExampleFilter(stream);
}
}
ExampleFilter.class and ExampleFilterFactory.class 添加到目录webapps/solr/WEB-INF/classes/pl/solr注册fieldtype:
<fieldtype name="exampleType" stored="true" indexed="true"
class="solr.TextField" >
<analyzer>
<tokenizer class="solr.WhitespaceTokenizerFactory" />
<filter class="pl.solr.ExampleFilterFactory" />
</analyzer>
</fieldtype>
自定义search component:
需要apache-solr-core-3.1.jar and apache-solr-solrj-3.1.jar,lucene-core-3.1.jar
继承SearchComponent:
public class ExampleSearchComponent extends SearchComponent {
String[] fieldNames = null;
@Override
public void prepare(ResponseBuilder builder) throws IOException {
fieldNames = builder.req.getParams().get("exampleFields", "").
split(",");
}
@Override
public void process(ResponseBuilder builder) throws IOException {
if (fieldNames != null) {
long totalMemorySize = 0;
SolrIndexSearcher searcher = builder.req.getSearcher();
for (String fieldName : fieldNames) {
UnInvertedField field = UnInvertedField.
getUnInvertedField(fieldName, searcher);
totalMemorySize += field.memSize();}
}
builder.rsp.add( "example", totalMemorySize );
}
@Override
public String getDescription() {
return "ExampleSearchComponent";
}
@Override
public String getSource() {
return "";
}
@Override
public String getSourceId() {
return "";
}
@Override
public String getVersion() {
return "1.0";
}
}
ExampleSearchComponent.class 放入目录 webapps/solr/WEB-INF/classes/pl/solr注册:
<requestHandler name="/example" class="solr.SearchHandler">
<arr name="components">
<str>exampleComponent</str>
</arr>
</requestHandler>
<searchComponent name="exampleComponent" class="pl.solr.
ExampleSearchComponent">
</searchComponent>
自定义field type:
需要apache-solr-core-3.1.jar,lucene-core-3.1.jar
继承SortableIntField:
public class ExampleFieldType extends SortableIntField {
public final String toInternal(final String value) {
return NumberUtils.int2sortableStr(getInternalValue(value));
}
public final void write(final XMLWriter xmlWriter, final String
name, final Fieldable field) throws IOException {
xmlWriter.writeStr(name, parseFromValue(String.
valueOf(getVal(field))));
}
public final void write(final TextResponseWriter writer, final
String name, final Fieldable field) throws IOException {
writer.writeStr(name, parseFromValue(String.
valueOf(getVal(field))), false);
}
protected String getInternalValue( String value ) {
String internalValue = value.replace(",", ".");
String[] parts = internalValue.split("\\.");
internalValue = parts[0];
if (parts.length > 1 && parts[1] != null) {
if (parts[1].length() == 2) {
internalValue += parts[1];
} else if (parts[1].length() == 1) {
internalValue += parts[1];
internalValue += "0";
} else {
internalValue += "00";
}
} else if (parts.length == 1) {
internalValue += "00";
}
return internalValue;
}
protected int getVal( Fieldable field ) {
String stringValue = field.stringValue();
return NumberUtils.SortableStr2int(stringValue, 0 ,
stringValue.length());
}
protected String parseFromValue(final String value) {
int length = value.length();
StringBuffer buffer = new StringBuffer();
if (length > 2) {
buffer.append(value.substring(0, length - 2));
buffer.append(".");
buffer.append(value.substring(length - 2 , length));
}
return buffer.toString();
}
}
ExampleFieldType.class 放入目录webapps/solr/WEB-INF/classes/pl/solr
使用:
<fieldtype name="example" class="pl.solr.ExampleFieldType" />
<field name="price" type="example" indexed="true" stored="true"/>