2015-10-20 106 views
9

我想通过时间范围查询Elasticsearch索引,并且还有一个术语匹配特定的字符串值。通过组合范围和术语匹配json格式来查询Elasticsearch

我已经试过此查询,这似乎非常简单:

{ 
    "query" : { 
    "bool": { 
     "must": [ 
     { 
      "match": { 
      "method": "/customer/help" 
      } 
     }, 
     { 
      "range" : { 
      "startTime": { 
       "from" : "2015-10-20T13:00-04:00", 
       "to" : "2015-10-20T14:00-04:00" 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

在这种情况下,我想所有给定的时间范围内的文件也有"/customer/help"方法的价值。

在我的结果中,我收到了在时间范围内的结果,但是我收到的文件有"method"字段的各种值,当时我只想在该字段中输入"/customer/help"的结果。

+1

“方法”字段值具有“客户”或“帮助”以及具有预期的“客户/帮助”结果的各种值?在这种情况下,问题在于Elasticsearch正在分析字段(如果没有指定映射,可能是标准分析器)。如果您不希望将来使用该分析仪,那么您可以为该字段设置“index”:“not_analyzed”属性。 – eemp

+0

其他值确实有customer/,但是奇怪的是,如果我单独运行一个查询来排除范围,那么我只会得到result =“customer/help”的结果。 –

+0

你通过了什么大小参数?这只是一个巧合,当你删除范围查询时,你只能看到所有结果的一个子集? – eemp

回答

13

在你的映射,你需要有methodnot_analyzed(或keyword分析仪分析)和查询应该使用term。这样一来,你在方法索引被索引的文本是作为一个单一的令牌和term确保您搜索的文本完全匹配的method索引的令牌:你需要使用

"method": { 
     "type": "string", 
     "index": "not_analyzed" 
    } 

和查询:

{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "term": { 
      "method": "/customer/help" 
      } 
     }, 
     { 
      "range": { 
      "startTime": { 
       "from": "2015-10-20T13:00-04:00", 
       "to": "2015-10-20T14:00-04:00" 
      } 
      } 
     } 
     ] 
    } 
    } 
} 
+0

是的,事实证明,这是标记字符串,从而扭曲结果。这个答案是正确的,谢谢!此外,我认为指出使用“match_phrase”查询而不是“match”查询可以在不更改索引的情况下获得正确结果。 –