2017-06-18 3 views
2

私はelasticsearchにAjaxリクエストを使用して検索結果を取得しています。 最後に、私は行く必要のあるクエリを見つけました。弾性検索:cURLからAjaxへのリクエスト

[~]$ curl -XGET 'localhost:9200/firebase/_search?pretty' -H 'Content-Type: application/json' -d' 
> {"query": {"match": {"song": {"query": "i am in", "operator": "and"}}}}' 

結果:

{ 
    "took" : 286, 
    "timed_out" : false, 
    "_shards" : { 
    "total" : 5, 
    "successful" : 5, 
    "failed" : 0 
    }, 
    "hits" : { 
    "total" : 1, 
    "max_score" : 0.8630463, 
    "hits" : [ 
     { 
     "_index" : "firebase", 
     "_type" : "song", 
     "_id" : "0001", 
     "_score" : 0.8630463, 
     "_source" : { 
      "song" : "i am in california", 
      "song_name" : "hello", 
      "song_url" : "https://s3.ap-south-1.amazonaws.com/..." 
     } 
     } 
    ] 
    } 
} 

このクエリは、私が必要とするまさにその結果与えます。ここ

はcURLの中のクエリである(これはlinkへのフォローアップの質問です) 。 AJAXで同じリクエストを使用していると、それは私に悪い要求を与えます。

Ajax.js

ケース1:コンソールで

$(function() { 
    $('#message').keyup(function() {  
     var query = { 
      "query": { 
       "match": { 
        "song": { 
         "query": $("#message").val(), 
         "operator": "and" 
        } 
       } 
      } 
     }; 

     console.log(JSON.stringify(query)); 

     $.ajax({ 
      type: "GET", 
      url: "http://localhost:9200/firebase/_search", 
      contentType: 'application/json', 
      data: query, 
      success: searchSuccess, 
      dataType: 'json' 
     }); 

    }); 

}); 

結果:

enter image description here

ケース2:私はJSON.stringifyを使って「データ」を変換する場合、それは私を与える:enter image description here

ケース3:私は次のようにクエリ構造を変更し、データ」にJSON.stringifyを使用している場合「:

var query = { 
    query: { 
     match: { 
      song: { 
       query: $("#message").val(), 
       operator: "and" 
      } 
     } 
    } 
}; 

結果は次のとおりです。

enter image description here

私はsのではありませんよ確かに何が問題なのでしょうか?クエリは正しいのですが、これはcURLと同じものを使用していて、bashで正しい結果を得ているからです。質問はここでAjaxリクエストを正しく作成する方法です。ポインタは高く評価されます。

編集:そして、はい、私はelasticsearch.ymlでCORSを有効にしている:

http.cors.enabled : true 
http.cors.allow-origin : "*" 
http.cors.allow-methods : OPTIONS, HEAD, GET, POST, PUT, DELETE 
http.cors.allow-headers : X-Requested-With,X-Auth-Token,Content-Type, Content-Length 

EDIT1:クローム、より多くの情報を提供するために、下にあるように、ネットワーク・データ: enter image description here

EDIT2:完全なエラー応答は以下の通りです:

{"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"request [/firebase/_search] contains unrecognized parameters: [query[match][song][operator]], [query[match][song][query]]"}],"type":"illegal_argument_exception","reason":"request [/firebase/_search] contains unrecognized parameters: [query[match][song][operator]], [query[match][song][query]]"},"status":400} 
+0

elastichostがインストールされているサーバのIPアドレスを使用する必要があります –

+0

私のクエリ構造が単純に - data:{'q':$( '#message')。val()、} 。 localhostに問題はありませんでした。しかし、通常のクエリは私の問題を解決していないので、私は一致を使用したかったので、変更を使用したかったのです。したがって、私はチェックして戻ってきますが、localhostが問題であるかどうかはわかりません。 – Manganese

+0

動作しません。 9200に127.0.0.1(ループバック)と192.168.0.1(サイトローカル)の両方を使用して試しました。さらに、私のelasticsearchは今のところローカルに実行されています。 – Manganese

答えて

2

私の経験から、体のGETメソッドの動作は、時々予測するのが難しい場合があります。実際には、弾力検索はGETを本体でサポートしていますが、サーバ、プロキシなどの設定によっては奇妙な結果が出ました...ドキュメントではJavaScript(search with GET)の問題も強調しています。

通常、GETの代わりにPOSTを使用すると、これらの問題を解決したり、少なくともデバッグオプションを追加することができます。

+0

それはすごく素晴らしいです!ありがとうございます、魅力のように動作します!そしてdoc参照のおかげです。 – Manganese