improve mlt serialization and deserialization

This commit is contained in:
kimchy 2010-05-13 18:50:34 +03:00
parent 836461e6de
commit 8573c26602
2 changed files with 72 additions and 24 deletions

View File

@ -19,6 +19,7 @@
package org.elasticsearch.action.mlt;
import org.apache.lucene.util.UnicodeUtil;
import org.elasticsearch.ElasticSearchGenerationException;
import org.elasticsearch.ElasticSearchIllegalArgumentException;
import org.elasticsearch.action.ActionRequest;
@ -38,8 +39,10 @@ import org.elasticsearch.util.io.stream.StreamOutput;
import org.elasticsearch.util.xcontent.XContentFactory;
import org.elasticsearch.util.xcontent.XContentType;
import org.elasticsearch.util.xcontent.builder.BinaryXContentBuilder;
import org.elasticsearch.util.xcontent.builder.XContentBuilder;
import java.io.IOException;
import java.util.Arrays;
import java.util.Map;
import static org.elasticsearch.search.Scroll.*;
@ -82,9 +85,11 @@ public class MoreLikeThisRequest implements ActionRequest {
private String[] searchIndices;
private String[] searchTypes;
private Scroll searchScroll;
private byte[] searchSource;
private transient SearchSourceBuilder searchSourceBuiler;
private byte[] searchSource;
private int searchSourceOffset;
private int searchSourceLength;
private boolean searchSourceUnsafe;
private boolean threadedListener = false;
@ -306,12 +311,24 @@ public class MoreLikeThisRequest implements ActionRequest {
return this.boostTerms;
}
void beforeLocalFork() {
if (searchSourceUnsafe) {
searchSource = Arrays.copyOfRange(searchSource, searchSourceOffset, searchSourceLength);
searchSourceOffset = 0;
searchSourceUnsafe = false;
}
}
/**
* An optional search source request allowing to control the search request for the
* more like this documents.
*/
public MoreLikeThisRequest searchSource(SearchSourceBuilder sourceBuilder) {
this.searchSourceBuiler = sourceBuilder;
FastByteArrayOutputStream bos = sourceBuilder.buildAsUnsafeBytes();
this.searchSource = bos.unsafeByteArray();
this.searchSourceOffset = 0;
this.searchSourceLength = bos.size();
this.searchSourceUnsafe = true;
return this;
}
@ -320,18 +337,34 @@ public class MoreLikeThisRequest implements ActionRequest {
* more like this documents.
*/
public MoreLikeThisRequest searchSource(String searchSource) {
return searchSource(Unicode.fromStringAsBytes(searchSource));
UnicodeUtil.UTF8Result result = Unicode.fromStringAsUtf8(searchSource);
this.searchSource = result.result;
this.searchSourceOffset = 0;
this.searchSourceLength = result.length;
this.searchSourceUnsafe = true;
return this;
}
public MoreLikeThisRequest searchSource(Map searchSource) {
try {
BinaryXContentBuilder builder = XContentFactory.contentBinaryBuilder(XContentType.JSON);
BinaryXContentBuilder builder = XContentFactory.contentBinaryBuilder(contentType);
builder.map(searchSource);
this.searchSource = builder.copiedBytes();
return searchSource(builder);
} catch (IOException e) {
throw new ElasticSearchGenerationException("Failed to generate [" + searchSource + "]", e);
}
return this;
}
public MoreLikeThisRequest searchSource(XContentBuilder builder) {
try {
this.searchSource = builder.unsafeBytes();
this.searchSourceOffset = 0;
this.searchSourceLength = builder.unsafeBytesLength();
this.searchSourceUnsafe = true;
return this;
} catch (IOException e) {
throw new ElasticSearchGenerationException("Failed to generate [" + builder + "]", e);
}
}
/**
@ -339,7 +372,18 @@ public class MoreLikeThisRequest implements ActionRequest {
* more like this documents.
*/
public MoreLikeThisRequest searchSource(byte[] searchSource) {
return searchSource(searchSource, 0, searchSource.length);
}
/**
* An optional search source request allowing to control the search request for the
* more like this documents.
*/
public MoreLikeThisRequest searchSource(byte[] searchSource, int offset, int length) {
this.searchSource = searchSource;
this.searchSourceOffset = offset;
this.searchSourceLength = length;
this.searchSourceUnsafe = false;
return this;
}
@ -348,12 +392,17 @@ public class MoreLikeThisRequest implements ActionRequest {
* more like this documents.
*/
public byte[] searchSource() {
if (searchSource == null && searchSourceBuiler != null) {
searchSource = searchSourceBuiler.buildAsBytes(contentType);
}
return this.searchSource;
}
public int searchSourceOffset() {
return searchSourceOffset;
}
public int searchSourceLength() {
return searchSourceLength;
}
/**
* The search type of the mlt search query.
*/
@ -530,11 +579,14 @@ public class MoreLikeThisRequest implements ActionRequest {
if (in.readBoolean()) {
searchScroll = readScroll(in);
}
size = in.readVInt();
if (size == 0) {
searchSourceUnsafe = false;
searchSourceOffset = 0;
searchSourceLength = in.readVInt();
if (searchSourceLength == 0) {
searchSource = Bytes.EMPTY_ARRAY;
} else {
searchSource = new byte[in.readVInt()];
searchSource = new byte[searchSourceLength];
in.readFully(searchSource);
}
}
@ -598,17 +650,11 @@ public class MoreLikeThisRequest implements ActionRequest {
out.writeBoolean(true);
searchScroll.writeTo(out);
}
if (searchSource == null && searchSourceBuiler == null) {
if (searchSource == null) {
out.writeVInt(0);
} else {
if (searchSource != null) {
out.writeVInt(searchSource.length);
out.writeBytes(searchSource);
} else {
FastByteArrayOutputStream os = searchSourceBuiler.buildAsUnsafeBytes(contentType);
out.writeVInt(os.size());
out.writeBytes(os.unsafeByteArray(), 0, os.size());
}
out.writeVInt(searchSourceLength);
out.writeBytes(searchSource, searchSourceOffset, searchSourceLength);
}
}
}

View File

@ -96,8 +96,10 @@ public class TransportMoreLikeThisAction extends BaseAction<MoreLikeThisRequest,
.fields(getFields.toArray(new String[getFields.size()]))
.type(request.type())
.id(request.id())
.listenerThreaded(false);
.listenerThreaded(false)
.operationThreaded(true);
request.beforeLocalFork();
getAction.execute(getRequest, new ActionListener<GetResponse>() {
@Override public void onResponse(GetResponse getResponse) {
if (!getResponse.exists()) {
@ -172,7 +174,7 @@ public class TransportMoreLikeThisAction extends BaseAction<MoreLikeThisRequest,
)
.listenerThreaded(request.listenerThreaded());
if (request.searchSource() != null) {
searchRequest.source(request.searchSource());
searchRequest.source(request.searchSource(), request.searchSourceOffset(), request.searchSourceLength());
}
searchAction.execute(searchRequest, new ActionListener<SearchResponse>() {
@Override public void onResponse(SearchResponse response) {