2014-12-03 3 views
1

저는 현재 elasticsearch에서 멋진 것을하려고 노력하고 있습니다 ... 그리고 그것은 거의 작동합니다.탄성 찾기가 "전체 용어"대신 "부분 용어"로 집계됩니다

사용 사례 : 특정 필드 당 결과 수를 (x) 개의 결과로 제한해야합니다.

예 : 결과 집합의 레스토랑에서는 레스토랑 이름 당 2 개의 위치 만 반환하려고합니다. 멕시칸 음식을 검색하면 (x) 타코 벨 히트, (x) 델 타코 히트 및 (x) 엘 토리 토 조회수를 얻어야합니다.

문제점 : 내 집계는 현재 용어의 일부만 일치합니다.

예를 들어

: 나는 company_name 일치하려고하면 타코 벨은 그 회사에 대한 (x) * 2 결과의 결과로,이 버킷에 표시 할 수 있도록, 그것은 하나의 타코 양동이 에 대한 또 다른 버킷을 만듭니다 .

나는 이것이 바람직한 행동이라고 믿기 어렵다. 전체 검색어로 집계 할 수 있습니까?

"aggs": { 
    "by_company": { 
     "terms": { 
     "field": "company_name" 
     }, 
     "aggs": { 
     "first_hit": { 
      "top_hits": {"size":1, "from": 0} 
     } 
     } 
    } 
} 

당신의 도움을, 언제나, 대단히 감사합니다 :

여기에 내 현재 집계 JSON입니다!

답변

2

예. "company_name"이 표준 분석기의 일반 문자열이거나 "company_name"에 대해 사용하는 모든 분석기가 이름을 분할하면 사용자의 대답입니다. ES는 말하지 않는 한 단어 나 전체 텍스트가 아닌 "용어"를 저장합니다.

해당 필드의 현재 분석기가 위에서 설명한 것과 동일하다고 가정하면 다른 것이 필요합니다. 즉, company_name 필드를 미러링해야하는 "원시"필드라고 부르지 만 회사 이름은 그대로 저장해야합니다.

{ 
    "mappings": { 
    "test": { 
     "properties": { 
     ..., 
     "company_name": { 
      "type": "multi_field", 
      "fields": { 
      "company_name": { 
       "type": "string" #and whatever you currently have in your mapping for `company_name` 
      }, 
      "raw": { 
       "type": "string", 
       "index": "not_analyzed" 
      } 
      } 
     } 
     } 
    } 
    } 
} 

그리고 당신의 쿼리에서, 당신은 이런 식으로 할 수 있습니다 :

이 무슨 뜻인지입니다

"aggs": { 
    "by_company": { 
     "terms": { 
     "field": "company_name.raw" 
     }, 
     "aggs": { 
     "first_hit": { 
      "top_hits": {"size":1, "from": 0} 
     } 
     } 
    } 
} 
+0

너무 감사합니다! 나는 이것을 테스트 해본 적이 없지만, 내가 ES에 대해 이미 알고있는 것에 기반하여, 이것이 해결책이라고 확신한다. 당신은 확실히 ES가 어떻게 작동하는지, 내가 이미 알고 있었어야 만했던 것, 그러나 그렇게하지 않은 것의 거대한 양상을 밝혀내는 것을 도왔습니다. –