使用具有特殊字符的值进行查询

时间:2014-10-27 17:52:29

标签: elasticsearch

我有一份文件如下:

{
    "_index": "logstash-2014.10.08",
    "_type": "iis",
    "_id": "HRM7LWfBSPGo9PUS0Z1ynw",
    "_score": 1,
    "_source": {
        "@version": "1",
        "@timestamp": "2014-10-08T12:37:26.000Z",
        "type": "iis",
        "messageId": 
  "O5pUHWOuEnTT0xQxXfNW6L+O6EMIjTFO7e//t+S/99en4zzOnlhqjEKlw02ZZVRFlyVaawA=="
    }
}

这是我的映射:

      "messageId" : {
        "type" : "string",
        "norms" : {
          "enabled" : false
        },
        "fields" : {
          "raw" : {
            "type" : "string",
            "index" : "not_analyzed",
            "ignore_above" : 256
          }
        }
      }

我正在尝试执行查询,并且我只想返回具有在查询时传递的messageId的确切值的文档。我尝试使用匹配和过滤器执行查询。

如果我使用term,则返回零文档:

{
  "query": {
    "term" : {
        "messageId" : 
      "O5pUHWOuEnTT0xQxXfNW6L+O6EMIjTFO7e//t+S/99en4zzOnlhqjEKlw02ZZVRFlyVaawA=="
        }
    }
}   

当我使用匹配时,我可以返回我的文档,但是如果我对messageId做了很少的更改,它仍会返回我的文档,查询中的messageId与文档不同。

{
  "query": {
    "match" : {
        "messageId" : 
             "O5pUHWOuxXfNW6L+O6EMIjTFO7e//t+S/99en4zzOnlhqjEKlw02ZZVRFlyVaawA=="
        }
    }
}

任何人都知道如何进行查询并检索具有messageId精确值的文档?

提前感谢。

1 个答案:

答案 0 :(得分:0)

我不相信这是一个特殊的角色问题,相反我认为这是一个分析指数与非分析问题。如果您使用常规的分析字段,则需要搜索小写的所有内容以获得术语匹配。对于未经分析的情况并非如此。

我使用你的样本运行了以下测试,我能够得到你想要的结果。

PUT index1

PUT index1/type1/_mapping
{
  "type1": {
    "properties": {
      "raw" : {
            "type" : "string",
            "index" : "not_analyzed",
            "ignore_above" : 256
          }
    }
  }
}

POST index1/type1
{
  "raw": "O5pUHWOuEnTT0xQxXfNW6L+O6EMIjTFO7e//t+S/99en4zzOnlhqjEKlw02ZZVRFlyVaawA=="
}

GET index1/type1/_search
{
  "query": {
    "term": {
      "raw": {
        "value": "O5pUHWOuEnTT0xQxXfNW6L+O6EMIjTFO7e//t+S/99en4zzOnlhqjEKlw02ZZVRFlyVaawA=="
      }
    }
  }
}

我的猜测是,您正在处理的字段中的数据会被分析。您可以通过使用_mapping API来检查这一点。在我的例子中将是:

GET index1/type1/_mapping