2014-11-09 2 views
0

문서를 읽은 후 elasticsearch에 다소 좌절감을 느낍니다. 그러나 '생성 된 쿼리가 유효하지 않습니다'라는 응답을 초과 할 수 없습니다. 지형 공간 정보와 대용량 데이터 세트에서 불완전한 중복을 찾으려면 elasticsearch를 사용하십시오. 이름 (부스트)과 주소를 일치시키고, 결과를 작은 지리적 상자로 필터링 한 다음 내 참조 지점에서 멀리있는 일치 항목의 관련성 점수를 줄입니다. 누군가가 도와 주실 수 있습니까? 내가 쿼리의 개별 요소를 understnad 생각, 내 주요 문제는 유효한 제품은 어떤 방식으로 함께 이들을두고있다.Elasticsearch : 생성 된 쿼리가 잘못되었습니다.

$query = new \Elastica\Query\Builder('{ 
     "function_score": { 
      "functions": [ 
       { 
        "gauss": { 
         "location": { 
          "origin": "'.$latitude.', '.$longitude.'", 
          "scale": "2km" 
         } 
        } 
       } 
      ], 
      "query": { 
       "filtered": { 
        "query": { 
         "bool": { 
          "should": [ 
           { 
            "match": { 
             "name": { 
              "query": "'.$name.'", 
              "boost": 4 
             } 
            } 
           }, 
           { 
            "match": { 
             "address": { 
              "query": "'.$address.'", 
              "boost": 1 
             } 
            } 
           } 
          ] 
         } 
        }, 
        "filter": { 
         "geo_distance": { 
          "distance": "2km", 
          "location": { 
           "lat": "'.$latitude.'", 
           "lon": "'.$longitude.'" 
          } 
         } 
        } 
       } 

      } 
    }') 
+1

"DECAY_FUNCTION"은 함수가 아닙니다. "gauss", "linear"및 "exp"가 있습니다. –

+0

예를 들어 'guass'대신 DECAY_FUNCTION을 사용하면 쿼리가 여전히 유효하지 않습니다 (위의 텍스트를 편집하기 위해 편집했습니다). 어떤 제안? – andrewl

+0

철자 가사가 적절하게 어쩌면? – greg0ire

답변

0

당신은 전체 쿼리 B를 둘러싸고한다 Y는 "쿼리"절 : 쿼리를 만들 때

$query = new \Elastica\Query\Builder('{ 
"query": { 
    "function_score": { 
     "functions": [ 
      { 
       "gauss": { 
        "location": { 
         "origin": "'.$latitude.', '.$longitude.'", 
         "scale": "2km" 
        } 
       } 
      } 
     ], 
     "query": { 
      "filtered": { 
       "query": { 
        "bool": { 
         "should": [ 
          { 
           "match": { 
            "name": { 
             "query": "'.$name.'", 
             "boost": 4 
            } 
           } 
          }, 
          { 
           "match": { 
            "address": { 
             "query": "'.$address.'", 
             "boost": 1 
            } 
           } 
          } 
         ] 
        } 
       }, 
       "filter": { 
        "geo_distance": { 
         "distance": "2km", 
         "location": { 
          "lat": "'.$latitude.'", 
          "lon": "'.$longitude.'" 
         } 
        } 
       } 
      } 
     } 
    } 
}') 

의견을 더 가지고, 좋은 습관은 쿼리에 Elasticsearch의 응답을 인쇄하는 것입니다.

당신의 SENSE에 쿼리를 시도 :

POST test/_search 
{ 
     "function_score": { 
      "functions": [ 
       { 
        "gauss": { 
         "location": { 
          "origin": "11, 12", 
          "scale": "2km" 
         } 
        } 
       } 
      ], 
      "query": { 
       "filtered": { 
        "query": { 
         "bool": { 
          "should": [ 
           { 
            "match": { 
             "name": { 
              "query": "name", 
              "boost": 4 
             } 
            } 
           }, 
           { 
            "match": { 
             "address": { 
              "query": "address", 
              "boost": 1 
             } 
            } 
           } 
          ] 
         } 
        }, 
        "filter": { 
         "geo_distance": { 
          "distance": "2km", 
          "location": { 
           "lat": "'.$latitude.'", 
           "lon": "'.$longitude.'" 
          } 
         } 
        } 
       } 
      } 
     } 
} 

당신은 응답을 얻을 것이다 :

SearchParseException [[테스트] [4] [-1], 크기 [-1 ] : 구문 분석 실패 [요소 [function_score]에 대한 파서 없음]]; }]

Elasticsearch가 "function_score"를 인식하지 못한다고 말하면됩니다. elasticsearch wiki에있는 function_score 페이지를 자세히 읽고 예제를 살펴보면, 둘러 쌓인 "query"절이 빠져 있음을 알 수 있습니다.

추 신 : Elastica는 ElasticaQueryBuilder를 사용하여 쿼리 본문을 생성하기 위해 alternative syntax도 제공합니다. 이는 json을 작성하지 못하도록합니다.

관련 문제