2017-10-16 79 views
0

我在ES具有下述類型的記錄的索引/類型:搜索內部JSON與彈性

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

主體字段是JSON.So我想搜索例如具有在記錄他們的JSON機構Status:0。 查詢應該是這個樣子(它不工作):

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

任何想法?

回答

0

您必須更改索引的分析器設置。

對於您提供的JSON模式,您需要有一個char_filter和一個標記器,它可以移除JSON元素,然後根據您的需要標記。

你的分析應該包含一個標記和喜歡這裏這些的一個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 
    } ] 
} 

這是由分析API檢索到的第一令牌("Status:0")是你正在使用你的搜索之一。