Elasticsearch not_analyzed field transformation double' $'符号

时间:2015-09-22 14:49:37

标签: elasticsearch

当我在未分析的字段中包含双美元符号时,我遇到了问题。当我使用以下命令检查类型的映射时:

curl -XGET 'http://localhost:9200/documents/_mapping/document'

我得到了代码字段的输出:

{
  "documents": {
    "mappings": {
      "document": {
        "properties": {
          "code": {
            "index": "not_analyzed",
            "type": "string"
          },
          // More field mappings

如果我使用以下命令测试映射:

curl -XGET 'http://localhost:9200/documents/_analyze?field=code' -d "ABC$"

我得到以下输出:

{"tokens":[{"token":"ABC$","start_offset":0,"end_offset":4,"type":"word","position":1}]}

这没关系,因为令牌与在命令中输入的数据具有相同的值。问题是当我使用这样的双美元符号时:

 curl -XGET 'http://localhost:9200/documents/_analyze?field=code' -d "ABC$$"

然后我得到以下标记:

{"tokens":[{"token":"ABC4088","start_offset":0,"end_offset":7,"type":"word","position":1}]}

看起来双美元符号被数字4088取代。根据文档,not_analyzed index属性意味着:

  

索引此字段,因此可以搜索,但将指定的值完全编入索引。不要分析它。

在代码字段映射中是否遗漏了一些内容以避免这种情况?

1 个答案:

答案 0 :(得分:1)

这是因为$$是shell中的一个特殊环境变量,它被扩展为当前shell进程的ID。

因此,在运行curl命令时,会发生当前shell的PID已解决并替换$$变量,因此您看到4088而不是$$ }。

尝试发布echo $$,您将看到当前shell的ID。

curl -XGET 'http://localhost:9200/documents/_analyze?field=code' -d "ABC4088"
                                                                          ^
                                                                          |
                                          $$ replaced by the ID of your process

尝试简单地转义$字符,你应该没问题

curl -XGET 'http://localhost:9200/documents/_analyze?field=code' -d "ABC\$\$"