2014-11-04 3 views
2

에 내가 문서 (유형 '기사')의 집합이 있고 내가 배열 필드검색 문서, ElasticSearch

으로 요소/객체를 가지고있는 문서를 검색 할
{ 
    "_type": "article", 
    "_source": { 
     "title": "Article 1", 
     "locations": [ 
      { 
       "address": "ES headquarter", 
       "city": "Berlin" 
      } 
     ] 
    } 
} 

나는 두 개의 쿼리합니다 (한, 그러나 약간의 변화에) :

  • 이 위치
  • ,691있는 모든 기사를 얻을 문제가 해결되지 않는

    { 
        "query": { 
        "filtered": { 
         "query": { 
         "match_all": {} 
         }, 
         "filter": [ 
         { 
          "type": { 
          "value": "article" 
          } 
         }, 
         { 
          "bool": { 
          "must_not": { 
           "missing": { 
           "field": "location", 
           "existence": true, 
           "null_value": true 
           } 
          } 
          } 
         } 
         ] 
        } 
        } 
    } 
    

    :

  • 내가 다른 일을 시도

NO 위치가 없지만 아마 내가 ElasticSearch 너무 나쁜거야 모든 기사를 얻을.

  • 내 검색어를 어떻게 수정하겠습니까?

하지만 주로 :

  • 어떻게 빈 배열 인 필드와 문서에 대한이 검색은 수행 할 것인가?

답변

6

address 당신이 당신의 쿼리를 수정할 수 있습니다 location 배열 필수 필드 인 경우 : ES에 당신이 (당신의 location 필드 등), 잎 이외의 요소를 쿼리 할 수 ​​없습니다,

"must_not": { 
    "missing": { 
    "field": "locations.address" 
    } 
} 

AFAIK을 (issue 참조)이 object 유형 ES는 중첩 된 필드를 평평하게합니다 (nested type, object type 참조). 그래서 리프 요소 중 하나를 대신 쿼리 할 것을 제안했습니다. 그러나 그 중 하나는 의무적 인 것이어야합니다 (이는 불행히도 귀하의 경우 만족스럽지 않습니다). "lang":"groovy"를 사용하여 작성해야한다는

"must_not": { 
    "script": { 
    "script": "_source.locations.size() > 0" 
    } 
} 

참고 :

어쨌든 나는 source_filtering 내부의 _source 매개 변수를 사용하여 솔루션을 발견 "script": "_source.locations.size > 0"

+0

아니요, 필수 입력 항목이 아닙니다. ** 어떻게 해결할 수 있을까요? **. ** 필수적인 경우 차이점은 무엇입니까? **. – Kamafeather

+0

답변을 업데이트했습니다! –

+0

와우 감사합니다! 이것은 거의 내가 필요한 해결책 인 것 같다. 문제점 : _________ [1]] (/ a /) ** script_lang이 [groovy]가 지원되지 않음 ** (* lang * 문을 제거함만으로 해결됨); 및 [2]] (/ b /) ** 오류 : 액세스 할 수 없습니다 : 크기; 클래스에서 : java.util.ArrayList ** 그리고 어떻게 진행 해야할지 모르겠다. ( – Kamafeather

0

이 비슷한 질문처럼 보이는 대답했습니다, 나는하지 않았다 해결책을 테스트하십시오. 그러나 시도해 볼 수 있습니다 : >>elasticsearch filtering by the size of a field that is an array.

+0

나는 그것을 이미 시도했지만 그것을 작동하게 만들 수는 없다. 나는 항상이 "script": "doc [ 'locations']. values.length> 0"'과 같은 식으로 * 'locations'* 필드를 읽는 데 문제가 있습니다. 그리고 내가 왜 그 분야를 찾을 수 없는지 이해하지 못한다 :-( – Kamafeather