すべてが正常に機能していたので、インデックスを再作成したところ、突然 3/5 ノードでエラーが発生し始めました。明らかに、これにより、結果の 2/3 しか適切に返されません。これは、カスタム検索クエリでのみ発生します。コードも jar も、動作しているときと動作していないときとで変わりました。
注: 通常のフィルタリングされた multi_match 検索クエリは問題なく機能します。
私が試してみました:
- すべてのインデックスの削除とすべてのデータの再インデックス化
- Elasticsearch の停止と開始
- カスタム スクリプトの再コンパイル
- 検索クエリを 50 回以上試行しました (半分は Java で、半分は CURL で)
Pastebin は、コンソールに表示されるエラーです: http://pastebin.com/1iq3M6fk
実行中の検索クエリ (これは何日も機能しており、変更されていません):
{
"query": {
"custom_score": {
"query": {
"multi_match": {
"query": "italian",
"fields": [
"name",
"tags"
]
}
},
"script": "customscript",
"params": {
"lat": 40.76405282025,
"lon": -73.972994269042
},
"lang": "native"
}
}
}
以下は、上記のクエリを実行したときに得られる応答です。
{
"took": 225,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 2,
"failed": 3,
"failures": [
{
"status": 500,
"reason": "RemoteTransportException[Failed to deserialize exception response from stream]; nested: TransportSerializationException[Failed to deserialize exception response from stream]; nested: StreamCorruptedException[unexpected end of block data]; "
},
{
"status": 500,
"reason": "RemoteTransportException[Failed to deserialize exception response from stream]; nested: TransportSerializationException[Failed to deserialize exception response from stream]; nested: StreamCorruptedException[unexpected end of block data]; "
},
{
"status": 500,
"reason": "RemoteTransportException[Failed to deserialize exception response from stream]; nested: TransportSerializationException[Failed to deserialize exception response from stream]; nested: StreamCorruptedException[unexpected end of block data]; "
}
]
},
"hits": {
"total": 548,
"max_score": 16.027588,
"hits": [
{
...
}
]
}
}
以下は、上記のクエリで使用されているカスタム スクリプトです (ファクトリもあります)。
import org.elasticsearch.common.Nullable;
import org.elasticsearch.script.ExecutableScript;
import org.elasticsearch.script.NativeScriptFactory;
import org.elasticsearch.script.AbstractDoubleSearchScript;
import org.elasticsearch.index.mapper.geo.GeoPointDocFieldData;
import java.util.Collection;
import java.util.Map;
import java.io.IOException;
import java.lang.Math;
public class CityMapsCustomScript extends AbstractDoubleSearchScript {
double lat;
double lon;
public CityMapsCustomScript(@Nullable Map<String, Object> params) {
lat = ((Double) params.get("lat")).doubleValue();
lon = ((Double) params.get("lon")).doubleValue();
}
@Override
public double runAsDouble() {
double distance = ((GeoPointDocFieldData) doc().field("location")).distance(lat, lon);
String str = doc().field("_type").getStringValue();
float score = score();
if (str.equals("business")) {
return -distance + (double) score;
} else {
return Double.parseDouble(doc().field("_boost").getStringValue());
}
}
}