1

すべてが正常に機能していたので、インデックスを再作成したところ、突然 3/5 ノードでエラーが発生し始めました。明らかに、これにより、結果の 2/3 しか適切に返されません。これは、カスタム検索クエリでのみ発生します。コードも jar も、動作しているときと動作していないときとで変わりました。

注: 通常のフィルタリングされた multi_match 検索クエリは問題なく機能します。

私が試してみました:

  1. すべてのインデックスの削除とすべてのデータの再インデックス化
  2. Elasticsearch の停止と開始
  3. カスタム スクリプトの再コンパイル
  4. 検索クエリを 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());
        }
    }
}
4

0 に答える 0