2012-03-27 2 views
2

필터 대신 검색어에 검색어를 추가 할 때 패싯이 0 개로 표시됩니다. 참고로 나는 루비와 함께 타이어 보석을 사용하고 있습니다. 여기에쿼리에서 Elasticsearch로 패싯 문제 발생

class Property < ActiveRecord::Base 
    include Tire::Model::Search 
    include Tire::Model::Callbacks 

    has_and_belongs_to_many :tags 

    mapping do 
    indexes :id,    type: 'integer' 
    indexes :status 
    indexes :refno,    type: 'integer' 
    indexes :name,    :analyzer => 'snowball', :boost => 100 
    indexes :description 
    indexes :tags,    type: 'object', 
            properties: { 
            name: { type: 'multi_field', 
             fields: { 
             name: { type: 'string', analyzer: 'snowball' }, 
             exact: { type: 'string', index: 'not_analyzed' } 
             } 
            } 
            }         
    end 

    def to_indexed_json 
    to_json(include: { 
     tags: { only: [:name] }, 
    }) 
    end 

내가 0 패싯을 얻을 검색 방법

def self.search(params={}) 
    tire.search(page: params[:page], per_page: 2, load: true) do 
     query do 
     boolean do 
     must { string params[:name], default_operator: "AND" } if params[:name].present? 
     must { term :status, 'live' } 
     must { term :refno, params[:refno]} if params[:refno].present? 
     # must { term :tag, params[:tag]} if params[:tag].present? ## does not work either 
     must { term 'tags.name.exact', params[:tag]} if params[:tag].present? 
     end 
     end 
     facet "tags" do 
     terms 'tags.name.exact' 
     end 
     raise to_json 
     # raise to_curl 
    end 
    end 

입니다 :

여기의지도 내 모델 코드입니다. 그러나 내가 패싯을 필터로 이동 시키면, 아래의 패싯이 나옵니다.

def self.search(params={}) 
    tire.search(page: params[:page], per_page: 2, load: true) do 
     query do 
     boolean do 
     must { string params[:name], default_operator: "AND" } if params[:name].present? 
     must { term :status, 'live' } 
     must { term :refno, params[:refno]} if params[:refno].present? 
     end 
     end 
     filter :term, 'tags.name.exact' => params[:tag] if params[:tag].present? 
     facet "tags" do 
     terms 'tags.name.exact' 
     end 
     raise to_json 
     # raise to_curl 
    end 
    end 

이 확인되는 동안 패싯 필터가 내면 필터에서 비 가능한 태그를 제거하고 새로운면 수를 업데이트 할을 클릭하면이 원하는 아니에요.

작동하는 쿼리에 대해 json이 도움이된다면.

## No Factes 
{ 
    "query":{ 
     "bool":{ 
     "must":[ 
      { 
       "query_string":{ 
        "query":"England", 
        "default_operator":"AND" 
       } 
      }, 
      { 
       "term":{ 
        "status":"live" 
       } 
      }, 
      { 
       "term":{ 
        "tags.name.exact":[ 
        "Pet Friendly" 
        ] 
       } 
      } 
     ] 
     } 
    }, 
    "facets":{ 
     "tags":{ 
     "terms":{ 
      "field":"tags.name.exact", 
      "size":10, 
      "all_terms":false 
     } 
     } 
    }, 
    "size":2 
} 

## Facets working 
{ 
    "query":{ 
     "bool":{ 
     "must":[ 
      { 
       "query_string":{ 
        "query":"England", 
        "default_operator":"AND" 
       } 
      }, 
      { 
       "term":{ 
        "status":"live" 
       } 
      } 
     ] 
     } 
    }, 
    "facets":{ 
     "tags":{ 
     "terms":{ 
      "field":"tags.name.exact", 
      "size":10, 
      "all_terms":false 
     } 
     } 
    }, 
    "filter":{ 
     "term":{ 
     "tags.name.exact":[ 
      "Pet Friendly" 
     ] 
     } 
    }, 
    "size":2 
} 

누군가가 조언을 해줄 수 있기를 바랍니다. 이걸로 내 머리카락을 꺼내기 시작 했어.

+0

단지 패싯이없는 쿼리가 결과를 반환합니까? – imotov

+0

태그에 대한 조건 필터를 주석 처리 한 다음 예를 선택하면 결과가 반환됩니다. 그리고 나는 패싯을 얻는다. 그래서 저에게 패싯 쿼리라는 용어에 오류가 있습니까? – Lee

+0

"검색어 {term 'tags.name.exact', params [: tag]} '를 주석 처리하지 않으면 검색 결과 (패싯이 아님)를 얻으려는 의도였습니다. 패싯은 요청의 쿼리 부분에 의해 제한된 결과를 기반으로 계산됩니다. 따라서 쿼리가 결과를 반환하지 않으면 패싯을 얻지 못합니다. – imotov

답변

3

을 실제로 매우 가까웠다. 내 태그 여러 가질 수 있듯이 나는

def self.search(params={}) 
    tire.search(page: params[:page], per_page: 2, load: true) do 
     query do 
     boolean do 
     must { string params[:name], default_operator: "AND" } if 
     must { term :status, 'live' } 
     must { term :refno, params[:refno]} if params[:refno].present? 
     must { terms 'tags.name.exact', params[:tag]} if params[:tag].present? 
     end 
     end 
     facet "tags" do 
     terms 'tags.name.exact' 
     end 
     # raise to_json 
     # raise to_curl 
    end 
    end 

이 imotov하지만 당신의 조언, 호앙 주셔서 감사합니다, 즉 부르는되지 않은 용어를 사용하는 데 필요한.

2

검색 요청은 대개 쿼리와 필터의 두 부분으로 구성됩니다. 검색 요청에 쿼리 파트 만 포함 된 경우 패싯은 전체 검색 결과를 기반으로 계산됩니다. 즉, 검색 결과에 태그가 "Pet Friendly"인 레코드가 10 개 있고 태그가 "No Pets Allowed"인 레코드가 5 개있는 경우 패싯 응답에는 "애완 동물 친절"과 "애완 동물 허용 없음"의 두 패싯이 포함됩니다. 이제 사용자가 "Pet Friendly"태그를 선택하여 결과를 제한한다고 가정 해 봅시다. "Pet Friendly"절이 요청의 쿼리 부분에 추가되면 검색 결과는 "Pet Friendly"태그가있는 10 개 레코드로 제한되며 "Pet Friendly"라는 단 하나의 패싯 만 반환됩니다. 그러나 "Pet Friendly"절이 필터로 추가되면 검색 결과는 여전히 10 개의 레코드로 제한되지만 두 개의 패싯이 반환됩니다. 패싯은 검색 요청의 쿼리 부분만을 기반으로 계산되고 쿼리 부분은 변경되지 않았기 때문에 발생합니다. 두 개의 다른 패싯이있는 15 개의 레코드로 검색 결과를 생성합니다.

쿼리에 결과가 반환되지 않으면 (예 : 사용자가 "애완 동물 친절"및 "애완 동물 허용 안함"태그 모두 선택) 결과에 패싯이 없으므로 패싯이 반환되지 않습니다.

3

당신은 정확한 결과를 얻을 수 패싯 seach에 대한 필터링 된 쿼리를 사용해야합니다

query do   
    filtered do 
    query { <search keywords> } 
    filter <your filter> (pass in facet values) 
    end 
end 
<facet> 
... 
<facet>