使用Elastic在JSON中搜索

时间:2017-10-16 10:57:06

标签: json elasticsearch

我在ES中有一个索引/类型,它具有以下类型的记录:

body    "{\"Status\":\"0\",\"Time\":\"2017-10-3 16:39:58.591\"}"
type    "xxxx"
source  "11.2.21.0"

正文字段是JSON。所以我想搜索其JSON正文Status:0中的记录。 查询应该看起来像这样(它不起作用):

GET <host>:<port>/index/type/_search
{
    "query": {
        "match" : {
            "body" : "Status:0"
        }
    }
}

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您必须更改索引的分析器设置。

对于你提出的JSON模式,你需要有一个char_filter和一个tokenizer来删除JSON元素,然后根据你的需要进行标记。

你的分析器应该包含一个tokenizer和一个像这样的char_filter:

{
  "tokenizer" : {
    "type": "pattern",
    "pattern": ","
  },
  "char_filter" : [ {
    "type" : "mapping",
    "mappings" : [ "{ => ", "} => ", "\" => " ]
  } ],
  "text" : [ "{\"Status\":\"0\",\"Time\":\"2017-10-3 16:39:58.591\"}" ]
}

解释:char_filter将删除字符:{ } "。令牌化器将用逗号标记。

可以使用Analyze API测试这些。如果您针对此API执行上述JSON,您将获得这些令牌:

{
  "tokens" : [ {
    "token" : "Status:0",
    "start_offset" : 2,
    "end_offset" : 13,
    "type" : "word",
    "position" : 0
  }, {
    "token" : "Time:2017-10-3 16:39:58.591",
    "start_offset" : 15,
    "end_offset" : 46,
    "type" : "word",
    "position" : 1
  } ]
}

Analyze API检索的第一个标记("Status:0")是您在搜索中使用的标记。