2013-03-24 2 views
0

색인을 쿼리하고 싶지만 필터를 2 개 적용하고 싶습니다. 먼저 가격과 두 번째 위치.ElasticSearch 쿼리 개체에 필터를 두 개 적용하려면 어떻게합니까?

var qobject = { 
     query:{ 
      custom_score:{ 
       query:{ 
        filtered:{ 
         query:{ 
          multi_match:{ 
           query: q, 
           fields: ['title','description'], 
          } 
         }, 
         filter:{ 
          range:{ 
           price: { from: 0, to: max_price } 
          }, 
          geo_distance:{ 
           'distance': distance + 'mi', 
           'location':{ 
            lat: lat, 
            lon: lon 
           } 
          } 
         } 
        } 
       }, 
       script: '_score + _source["price"] * 10' 
      } 
     } 
    } 

    elasticSearchClient.search('products', 'products', qobject) 

이 쿼리 개체는 오류가 발생합니다.

그러나 범위 또는 geo_distance을 제거하면 모든 것이 정상입니다! 하지만 두 필터가 모두 필요합니다 ...

답변

2

'and'-filter를 사용하십시오. 테스트없이

http://www.elasticsearch.org/guide/reference/query-dsl/and-filter.html

:

var qobject = { 
     query:{ 
      custom_score:{ 
       query:{ 
        filtered:{ 
         query:{ 
          multi_match:{ 
           query: q, 
           fields: ['title','description'], 
          } 
         }, 
         filter:{ 
          "and" : [ 
           range:{ 
            price: { from: 0, to: max_price } 
           }, 
           geo_distance:{ 
            'distance': distance + 'mi', 
            'location':{ 
             lat: lat, 
             lon: lon 
            } 
           } 
          ] 
         } 
        } 
       }, 
       script: '_score + _source["price"] * 10' 
      } 
     } 
    } 

설명 : 필터링 된 쿼리 '의 filter' 부분은'와 ''실제로 포함, 당신이 좋아하는 모든 종류의 필터가 될 수 있습니다 '. 이 개념이 명확 해지면 복잡한 쿼리/필터를 작성하는 것이 매우 쉽습니다.

+0

"및"다른 필터 안에 필터를 감싸는 것과 같은 기능을 사용합니까? – TIMEX

+0

무슨 뜻인지 확실하지 않아. '및'과 같은 일부 필터는 특히 다른 필터를 중첩하기 위해 만들어졌습니다.이 배치를 내가 가정 할 수 있습니다. –

+0

당신이 찾을 수있는 문서를 볼 때, 또는 필터하지 않을 수 있습니다. 이들 모두는 임의로 복잡한 부울 쿼리를 구성 할 수있는 다른 필터 (임의로 deep : 및 inside 등을 중첩 할 수 있음) –

관련 문제