2015-02-02 2 views
3

query_stringrange을 같은 쿼리에서 어떻게 둘 수 있습니까?query_string 및 range 동시에 표시

{"query": {"query_string": {"query": "field1:value1"}, 
      "range": {"time": {"gt": "2014-11-01T00:00:00Z", 
           "lte": "2014-11-01T03:00:00Z"}}}, 
    "aggs": {"counts": {"date_histogram": {"field": "time", 
             "interval": "minute"}}}} 

을하지만 ES 날이 오류를 제공합니다 :

나는 /myindex/mytype/_search/?search_type=count이를 보내고

ElasticsearchParseException[Expected field name but got START_OBJECT \"range\"]; 

나도 range 또는 query_string, 그것은 잘 작동하지만 많이 필요로하지 않고 제거 할 경우를 필터링 :)

답변

6

을, 당신이 당신이 계산 집계되는 범위를 줄이기 위해 여러 쿼리를 결합하려는 보이는 당신이 말하는에서 .

첫째, 이것은 당신이 문서가 두 쿼리와 일치해야하는 경우합니다 (must 절 참조) 또는 쿼리 중 하나 이상이 (should 절 참조)를 결정할 수있는 bool 쿼리 (documentation)를 사용하여 달성 될 수있다.

의 당신이 당신의 결과 문서 모두 쿼리와 일치하고 싶은 말은하자, 구문은 다음과 같습니다

{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "query_string": { 
      ... 
      } 
     }, 
     { 
      "range": { 
      ... 
      } 
     } 
     ] 
    } 
    } 
} 

이 작동하지만이없는 최적의 방법은 쿼리. range 쿼리에 해당 필터가 있으므로 최적화 할 수 있습니다.

필터 버전을 사용하면 점수 계산을 건너 뛰고 대부분의 필터 유형 (자세한 내용은 differences between queries and filters here)에서 캐시에 도달하므로 일반적으로 필터 버전을 사용하면 더 빠릅니다.

  • filter
  • 를 필터링 할 쿼리 :

    • query :

      그러나, 필터가 query 속성에 직접 사용할 수 없습니다, 당신은 두 가지 속성을 가진 filtered 쿼리에 포장해야 :

      : 필터는이 같은 쿼리를해야합니다,

    마지막으로 쿼리와 결합하기

    { 
        "query": { 
        "filtered": { 
         "query": { 
         "query_string": { 
          "query": "field1:value1" 
         } 
         }, 
         "filter": { 
         "range": { 
          "time": { 
          "gt": "2014-11-01T00:00:00Z", 
          "lte": "2014-11-01T03:00:00Z" 
          } 
         } 
         } 
        } 
        }, 
        "aggs": { 
        "counts": { 
         "date_histogram": { 
         "field": "time", 
         "interval": "minute" 
         } 
        } 
        } 
    } 
    
    +0

    감사합니다. 작동했습니다! 참고로,'and'와'or'를 호출하는 이상한 방법은 다음과 같습니다. –

    +0

    또 다른 작은 질문입니다. 결과 목록은'lte'이고'lt'가 아니라는 조건에도 불구하고 02:59:00으로 끝납니다. 뭐라 구요? –

    +0

    당신을 진심으로 환영합니다. 질문에 대해서는 02:59:00에서 03:00:00 사이에 결과를 가져야합니까? – ThomasC

    3

    나는 당신이 좋아한다고 생각한다 :

    { "query": { 
        "bool": { 
         "must": [ 
          { "range": { 
           "time": { "gt": "2014-11-01T00:00:00Z", 
              "lte": "2014-11-01T03:00:00Z" } 
           } 
          }, 
    
          { "query_string": { "query", "field1:value1" } } 
         ] 
        } 
    }} 
    

    Elasticsearch는 단일 "쿼리"태그로 여러 항목을 함께 연결할 수있는 것처럼 보이지 않습니다.

    (형식에 대한 미안 해요, { 꽤보고 줄 수 없습니다.)

    +0

    고마워요! 예상대로 정확하게 작동합니다. –

    +1

    문제 없습니다. 나는 탄력적 인 검색으로 일을 시작 했으므로, 같은 일을하는 방식을 이해해야합니다. :) – TZHX