【问题标题】:elastic search ngram special characters弹性搜索ngram特殊字符
【发布时间】:2013-08-01 12:32:16
【问题描述】:

我有一个具有以下默认配置的弹性搜索节点

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": "\\\\\\\\"
    }
  }
}'

应该可以,但是不行。好困惑。

【问题讨论】:

    标签: elasticsearch n-gram


    【解决方案1】:

    我认为这是因为在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" : "\\?"}}}'

    【讨论】:

      【解决方案2】:

      是的,您对转义的表示是正确的,我昨天工作很晚,但仍然无法正确搜索“\”,对于 json 搜索帖子,我们需要一个额外的“\”,因此对于第一个选择,我将发布

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

      但这并没有帮助必须使用“\\”并且不能使用更多或更少,所以试图找出匹配单个“\”和“\”的查询是什么,尽管如果我只是逃避,python中的弹性工具每个带有“\”的特殊字符都可以通过代码很好地处理包括“\”在内的所有特殊字符,但 curl 没有

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-23
        • 2022-08-17
        • 2016-10-15
        • 1970-01-01
        • 2023-03-19
        • 2021-06-22
        • 2021-10-11
        • 1970-01-01
        相关资源
        最近更新 更多