我有一个弹性搜索节点,其中包含以下默认配置
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
然后我创建了一个索引“test”
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": "\\\\\\\\"
}
}
}'
应该有效,但事实并非如此。非常困惑。
答案 0 :(得分:0)
我认为这是因为在oi\\me
中,第一个反斜杠用于转义第二个斜杠,而不是存储为文字字符。这解释了为什么\\\\
有效,因为在HTTP请求中,两个斜杠转义其他两个,然后在查询中,其余的第一个转义为第二个。
作为一般规则,当您将查询作为JSON传递时,必须转义更多内容。也就是说,
curl -XPOST 'localhost:9200/test/sub/_search?pretty&q=\?'
与
相同 curl -XPOST 'localhost:9200/test/sub/_search?pretty' -d '{"query" : {"query_string" : {"query" : "\\?"}}}'
答案 1 :(得分:0)
是的,您对逃生的表示是正确的,我昨天晚上工作但是仍然无法正确搜索“,”对于json搜索帖我们需要一个额外的“\”因此对于第一个选择我会发布
curl -XPOST 'localhost:9200/test/sub/_search?pretty' -d '{"query" : {"query_string" : {"query" : "\\"}}}'
但这并没有帮助必须使用“\\”并且不能使用或多或少,所以试图找出匹配单个“\”和“\”的查询,但是如果我只是逃避python中的弹性工具每个带有“\”的特殊字符都可以通过所有特殊字符的代码很好地工作,包括“\”但是curl不会