2013-06-12 3 views
1

텍스트/키워드 상자와 여러 개의 필터가있는이 검색 기능이 있습니다. 부울 블록 (Tire/ElasticSearch)이있는 필터

query do 
    boolean do 
    must { string params[:text], default_operator: "AND" } unless params[:text].blank? 
    must { } unless 
    must { } unless 
    should { } unless 
    # some more must/should/must_not queries 
    end 
end 

# Some sorting 

는 지금까지 내가 읽고으로, (속도 및 캐싱 등의 측면에서) 타이어가 제공하는 실제 filter를 사용하여 구현하는 더 나은 방법이 될 것이다 : 나는 다음과 같은 구조로 지금 시행하고있다.

나는 이것을 구현하는 올바른 방법이 무엇인지 물어보고 싶습니다. 비슷한 boolean 블록을 filter에 전달하는 방법을 찾지 못했습니다. 좋을 것 같습니다. 어쩌면 내가 잘못하고있는거야?

나는이 내게합니다 (filter 블록 라인에서) 다음과 같은 오류 제공

# This would be the main query, by text/keyword 
query { string params[:text], default_operator: "AND" } unless params[:text].blank? 

filter do 
    boolean do 
    # My regular filters that I implemented with queries 
    must { } unless 
    must { } unless 
    should { } unless 
    end 
end 

# Some sorting 

같은 일을 생각하고 : 또한 ArgumentError - wrong number of arguments (0 for 1):

을, 나는이 문제가 ElasticSearch를 사용하여 달성 할 수 있다는 것을 알고 JSON 쿼리 (여기에 표시된 것처럼) : http://www.elasticsearch.org/guide/reference/query-dsl/bool-filter/. 그래서 타이어가이 기능 위에 비슷한 기능을 제공한다고 가정합니다.

도움 주셔서 감사합니다.

편집
내가 지금하려고하는 것은 다음과 같은 방법으로, 필터링 된 검색을 사용하는 것입니다

query do 
    filtered do 
    query { string params[:text], default_operator: "AND" } unless params[:text].blank? 

    # And here I would like to add the filter block... but for now I am using the filter :and 
    filter :and, { :terms => { } } unless params[:something1].blank?, 
       { :terms => { } } unless params[:something2].blank?, 
       { :range => { } } unless params[:something3].blank?, 
       # more filters that need the AND behavior 
    filter :or, { :terms => { } } unless params[:something4].blank? 
       # more filters that need the OR behavior 
    end 
end 

나는 또한 filter :and가 빠르다는 것을 읽을 수 있기 때문에이 방법을 생각하고있다 boolean보다. 이 올바른지?

이제 이러한 필터가 캐시됩니까? 또한,이 상황에서 올바른 접근 방식입니까?

감사합니다.

편집

에서 내가 코멘트에 게시 된 문제에 읽은, 내가 같은 것을 할 수 있다고 생각 :

filter :bool => [ 
    { :must => { :terms => { } } } unless ... , 
    { :must => { :terms => { } } } unless ... , 
    { :should => { :terms => { } } } unless ... , 
    # and the other filters 

]

이 권리인가를?

감사합니다.

+0

방금 ​​다음 호를 발견했습니다. https://github.com/karmi/tire/issues/2. karmi가'filter'를 위해이 기능을 실제로 구현하지 않은 것처럼 보입니까? – vburca

+0

안녕하세요! 답변으로 의견을 게시하고 수락 할 수 있습니까? 같은 이슈를 가진 사람들을 도울 수 있습니다. – ramseykhalaf

+0

좋아, 나는 아마 기다리고 있었다, 아마 karmi가 올 것이고, 그것을 깨끗하게 할 것이기를 바랐다 :) – vburca

답변

4

방금 ​​https://github.com/karmi/tire/issues/2 호를 발견했습니다. karmi가 필터에이 기능을 실제로 구현하지 않은 것처럼 보입니까?나는 통합 테스트의 일부에서 보았 듯이

한편, 나는 이런 식으로 뭔가를 할 수 있다고 생각 :

여기
filter :bool => [ 
    { :must => { :terms => { } } } unless ... , 
    { :must => { :terms => { } } } unless ... , 
    { :should => { :terms => { } } } unless ... , 
    # and the other filters 
] 

소스입니다 : 또한 https://github.com/karmi/tire/commit/01ba026

, 나는 결국 쓰는 간단한, 내 특정 사건에 대한 하나의 필터 :

query { all } unless !params[:keyword].blank? 
query { string params[:keyword], default_operator: "AND" } unless params[:keyword].blank? 

filter :term, :a => params[:a] unless params[:a].blank? 
filter :term, :b => params[:b] unless params[:b].blank? 

filter :range, :c => { gte: params[:c_min] } unless params[:c_min].blank? 
filter :range, :c => { lte: params[:c_max] } unless params[:c_max].blank? 

filter :terms, :d => params[:d] unless params[:d].blank? 

# and more such filters, just wanted to give more examples since 
# the documentation is so sparse over the internet and I know what 
# it takes to find everything in one place :) 

나는 여전히이 가장 편리한 방법 아니라고 생각하지만 내 경우에는 일을 (부울 블록은 ㄱ 것 좋은 필터를 가지고 있지만, 내가 읽은만큼, :and 필터는 :bool 필터보다 빠르며, 위에서 한 것처럼 여러 필터 목록을 나열합니다. 지금까지 이해 한만큼, 그러한 필터를 만듭니다. :and 필터).

이것은 처음 필터보다 더 나은 접근 방법이라고 생각합니다. 이제는 이러한 필터가 캐싱 될 수 있기 때문에 (다시 말하면 다시 읽습니다). 이 미래에 누군가 :) 또한

사람이 더 나은 제안/설명/유용한 팁이있는 경우, 기여 주시기 바랍니다 도움이 될

희망!

감사합니다.