0

次のデフォルト構成のエラスティック検索ノードを使用しています

index :
  analysis :
    analyzer :
      default_index :
        type : custom
        tokenizer : whitespace
        filter :
        - lowercase
        - asciifolding
        - stop
        - my_ngram
        char_filter : html_strip
      default_search:
        type : custom
        tokenizer :  whitespace
        filter:
        - lowercase
        - asciifolding
        - stop
        char_filter :  html_strip
    filter:
      my_ngram:
        type: nGram
        max_gram: 50

次に、インデックス「テスト」を作成します

curl -XPUT localhost:9200/test -d '{
  "settings": {
    "index": {
      "number_of_shards": 1,
      "number_of_replicas": 0
    }
  }
}'

私が投稿しました

curl -XPOST localhost:9200/test/sub -d '{"n1" : "so?:me"}'

として検索

curl -XPOST 'localhost:9200/test/sub/_search?pretty&q=\?'

上記のエントリで正しい結果が得られますが、そうすると

curl -XPOST localhost:9200/test/sub/_search -d '{
  "query": {
    "query_string": {
      "query": "\?"
    }
  }
}'

以下のように例外が発生します

{
  "error": "SearchPhaseExecutionException[Failed to execute phase [query_fetch], total failure;
            shardFailures {[1fLLfu79Qou8RbdrI6y8qw][test][0]: 
            SearchParseException[[test][0]: from[-1],size[-1]: 
            Parse Failure [Failed to parse source [
              {
                "query": {
                  "query_string": {
                    "query": "\\?"
                  }
                }
              }
            ]]];
            nested: QueryParsingException[[test] Failed to parse]; 
            nested: JsonParseException[Unrecognized character escape '?' (code 63)\n at [Source: [B@1601cda; line: 1, column: 45]]; }]",
  "status": 500
}

ここで何が欠けているのかわからないのですか?

もう少し詳細を見つけましたが、もっと混乱しています。

私が投稿した場合

curl -XPOST localhost:9200/test/sub/_search -d '{
  "query": {
    "query_string": {
      "query": "\\?"
    }
  }
}'

JSONエスケープ文字自体をエスケープする必要があるように見えます。しかし、私は投稿します

curl -XPOST localhost:9200/test/sub -d '{"n1" : "oi\\me"}'

そして今私が投稿した場合

curl -XPOST localhost:9200/test/sub/_search?pretty -d '{
  "query": {
    "query_string": {
      "query": "\\\\"
    }
  }
}'

上記が以前に見つけたものが答えの最初の「\」だけを表していると仮定すると、理想的には結果が得られます

curl -XPOST localhost:9200/test/sub/_search?pretty -d '{
  "query": {
    "query_string": {
      "query": "\\\\\\\\"
    }
  }
}'

動作するはずですが、動作しません。とても混乱しています。

4

2 に答える 2

0

ええ、エスケープの表現は正しいです。昨日遅くに動作しましたが、まだ「\」検索を正しく取得できませんでした.json検索投稿には追加の「\」が必要です。したがって、最初の選択で投稿します

curl -XPOST 'localhost:9200/test/sub/_search?pretty' -d '{"query" : {"query_string" : {"query" : "\\"}}}'

しかし、それは「\\」を使用する必要がなく、多かれ少なかれ使用できないため、単一の「\」と「\」を一致させるためのクエリを理解しようとしていますが、すべての特殊文字をエスケープするだけの場合、Python の弾性ユーティリティを使用します「\」を使用すると、「\」を含むすべての特殊文字のコードを介してうまく機能しますが、curl は機能しません

于 2013-08-02T10:44:52.803 に答える
0

oi\\meでは、最初のバックスラッシュがリテラル文字として保存されるのではなく、2 番目のバックスラッシュをエスケープするために使用されているためだと思います。\\\\HTTP リクエストでは、2 つのスラッシュが他の 2 つのスラッシュをエスケープし、クエリでは、残りのスラッシュの最初のスラッシュが 2 番目のスラッシュをエスケープするため、これが機能する理由を説明しています。

原則として、クエリを JSON として渡す場合は、さらにエスケープする必要があります。あれは、

curl -XPOST 'localhost:9200/test/sub/_search?pretty&q=\?'

と同じです

curl -XPOST 'localhost:9200/test/sub/_search?pretty' -d '{"query" : {"query_string" : {"query" : "\\?"}}}'

于 2013-08-01T19:41:55.677 に答える