2013-01-11 3 views
0

Tire를 사용하여 지속 모델에서 중첩 쿼리를 수행하려고합니다. 모델 (것)는 태그를 가지고 있으며 나는 쿼리를 실행할 때 나는 "하지 얻을 지속 검색을 통한 탄성 검색/타이어 중첩 쿼리

class Thing 
    def self.find_all_by_tag(tag_name, args) 
     self.search(args) do 
     query do 
      nested path: 'tags' do 
       query do 
        boolean do 
        must { match 'tags.name', tag_name } 
       end 
       end 
      end 
     end 
     end 
    end 
end 

같은 중첩 된 쿼리가 보이는

class Thing 
    include Tire::Model::Callbacks 
    include Tire::Model::Persistence 

    index_name { "#{Rails.env}-thing" } 

    property :title, :type => :string 
    property :tags, :default => [], :analyzer => 'keyword', :class => [Tag], :type => :nested 
end 

특정 태그가 모든 것을 찾을 찾고 있어요 재산 "이 매핑이 전달 옵션에서 생성 된 것으로 보인다 타이어의 소스를 보면 오류

Parse Failure [Failed to parse source [{\"query\":{\"nested\":{\"query\":{\"bool\":{\"must\":[{\"match\":{\"tags.name\":{\"query\":\"TestTag\"}}}]}},\"path\":\"tags\"}},\"size\":10,\"from\":0,\"version\":true}]]]; nested: QueryParsingException[[test-thing] [nested] nested object under path [tags] is not of nested type]; }]","status":500} 

"중첩 된 형태의 매핑 "블록"방법, 그래서 내가 별도 필요하다고 생각하지 않는다 " 클래스. 누구든지 내가 뭘 잘못하고 있는지 알 수 있니? 아래 Karmi의 대답에 따라

UPDATE

, 나는 인덱스를 다시 작성하고 매핑이 올바른지 확인 :

thing: { 
    properties: { 
    tags: { 
     properties: { 
     name: { 
      type: string 
     } 
     type: nested 
     } 
    } 
    title: { 
     type: string 
    } 
    } 

그러나, 나는

thing = Thing.new 
thing.title = "Title" 
thing.tags << {:name => 'Tag'} 
thing.save 

에 새 태그를 추가 할 때

매핑이 "동적"유형으로 바뀌고 "중첩 된"유형이 손실됩니다.

thing: { 
    properties: { 
    tags: { 
     properties: { 
     name: { 
      type: string 
     } 
     type: "dynamic" 
     } 
    } 
    title: { 
     type: string 
    } 
    } 

이전과 같은 오류로 쿼리가 실패합니다. 새 태그를 추가 할 때 중첩 유형을 어떻게 보존합니까?

답변

1

사실, property 선언의 매핑 구성은 지속성 통합에서 전달됩니다.

이와 같은 상황에서 항상 첫 번째 질문이 있습니다. 의 매핑은 어떻게됩니까?

예를 들어, Thing.index.mapping 메소드 또는 Elasticsearch의 REST API : curl localhost:9200/things/_mapping을 참조하십시오.

인덱스는 사용 된 JSON에 기반한 동적 매핑으로 생성되었으며 나중에 매핑을 변경했습니다. 이 경우 색인 생성 논리는 건너 뛰고 매핑은 예상 한 것과 다릅니다.


타이어issue 인덱스 매핑 모델에 정의 된 매핑 다른 경우 경고 표시에 대해 열려있다.

+0

도움을 주셔서 감사 드리며 훌륭한 라이브러리입니다. 새 태그를 추가 할 때 중첩 된 문서 형식을 유지하는 데 여전히 문제가 있습니다. 세부 사항으로 질문을 업데이트했습니다. 어떤 빛을 비춰 줄 수 있습니까? –

+0

나는이 일을하고있어, 고마워. 각 테스트 설정에서 Thing.create_elasticsearch_index를 호출하여 매핑이 제대로 작성되었는지 확인해야했습니다. –