2014-09-29 20 views
0

특정 조건을 기반으로 Solr에서 쿼리 필드를 정의 할 수 있습니까? 예 :Solr 조건부 쿼리 필드 (qf)

<str name="qf">text^0.5 title^10.0 Product</str> 

내가 여기 찾고 있어요 것은 특정 조건이 예를 들어,이 충족 된 경우에만 검색 필드로 "제품"을 포함하는 것입니다 : 나는 세 개의 필드 텍스트, 제목과의 product.The SOLR의 설정 정의를했습니다 작성자 인 경우 : "Tom"을 선택하고 Product에서 검색하십시오.

edismax를 사용하여 쿼리하는 동안 그렇게 할 방법이 있습니까?

다른 방법 색인 시간 동안 문서의 텍스트 또는 제목 (작성자 = Tom)에 제품 정보를 추가하여 검색 할 수 있도록했습니다. 그러나 가능한 경우이 문제를 피하려고합니다.

모든 포인터가 제공됩니다.

고마워요

답변

5

다른 조건에 따라 다른 필드를 검색하려면 먼저 특정 조건을 검색해야 할 필요가 있으므로 여러 쿼리를 발행하는 것과 거의 같습니다. 말했다


, 경우 (예를 들어, 아웃 - 오브 - 박스가/그룹/기타 SOLR 기능 정렬)에 nested queries 사용할 수 있습니다 한 번 쿼리로 그것을 할 필요가있다.

두 가지 조건을 정의

(일본어 문제로되지만 쉽게 더 OR 절을 확장 할 수있다) 상기 q 파라미터는 다음 값을 수신 할 수 있으므로, 거기

_query_:"{!edismax fq=$fq1 qf=$qf1 v=$condQuery}" 
OR 
_query_:"{!edismax fq=$fq2 qf=$qf2 v=$condQuery}" 

쿼리에 Parameter Dereferencing 사용 매개 변수를 solr에 전달하기 전에 특수 문자를 수동으로 이스케이프 할 필요가 없습니다.

  • FQ1 - 제 특수 조건
  • qf1 - 필드 목록 제 특수 조건 (FQ1)
  • FQ2위한 검색 방법 - 제 특수 조건
  • qf2 - 첫 번째 특수 조건을 검색 할 필드 목록 (fq2)
  • condQuery - 실제 검색 용어/쿼리

FQ1 기준을 정의하기 위해 비어있을 수 있습니다 (이 특별한 경우 - producttexttitle에서 검색을하지만).

원시 매개 변수 자체는 다음과 같이 보일 것이다 :

fq1=&qf1=text^0.5 title^10.0&fq2=author:"Tom"&qf2=text^0.5 title^10.0 Product&condQuery=5 

을 최종 쿼리는 다음과 같이 될 것입니다 : SOLR 응답에 SOLR에 의해 반환

http://localhost:8983/solr/collection1/select?q=_query_%3A%22%7B!edismax+fq%3D%24fq1+qf%3D%24qf1+v%3D%24condQuery%7D%22+OR+_query_%3A%22%7B!edismax+fq%3D%24fq2+qf%3D%24qf2+v%3D%24condQuery%7D%22&fl=*%2Cscore&wt=xml&indent=true&fq1=&qf1=text^0.5%20title^10.0&fq2=author:%22Tom%22&qf2=text^0.5%20title^10.0%20Product&condQuery=5 

.. 나 같은 쿼리 (구조화 된 방식으로 보여주기 위해 제공됨) :

<response> 
    <lst name="responseHeader"> 
     <int name="status">0</int> 
     <int name="QTime">1</int> 
     <lst name="params"> 
      <str name="q">_query_:"{!edismax fq=$fq1 qf=$qf1 v=$condQuery}" OR _query_:"{!edismax fq=$fq2 qf=$qf2 v=$condQuery}"</str> 
      <str name="condQuery">5</str> 
      <str name="indent">true</str> 
      <str name="fl">*,score</str> 
      <str name="fq1"/> 
      <str name="qf1">text^0.5 title^10.0</str> 
      <str name="fq2">author:"Tom"</str> 
      <str name="qf2">text^0.5 title^10.0 Product</str> 
      <str name="wt">xml</str> 
     </lst> 
    </lst> 
    <result name="response" numFound="..." start="..." maxScore="..."> 
     ... 
    </result> 
</response> 

작동하더라도 각 조건이 별도의 내부 검색 쿼리를 가지므로 쿼리 시간에 미치는 영향을 고려하여 특정 사례에 미치는 영향을 측정하는 것이 좋습니다.

+0

고맙습니다. 저는 이것을 구현하는 방법을 알아 내려고 노력했습니다. – Vince

0

Shamik, 나는 생각하지 않는다

을 사용하여 달성 될 수있는 것처럼하는 방법으로이 보인다 Solr에서 쉽게 할 수 있습니다. 한 가지 고려해야 할 사항은 초과 근무 시간에도 이러한 규칙을 관리하는 것입니다. 대형 시스템에서는 악몽이 될 수 있습니다.

정말 이런 식으로하고 싶다면 아마도 두 가지 결과를 얻기 위해 Solr을 호출 할 수 있습니다.