다중 가치 패싯 필드에서 그리고 동시에 Solr에서 빈 패싯을 검색하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/2250751

  •  20-09-2019
  •  | 
  •  

문제

사용자가 자동차 부품을 선택할 수있는 응용 프로그램이 있습니다. 그들은 차량을 선택한 다음 차량 속성을 패싯으로 선택합니다. 차량을 선택한 후에는 엔진 크기와 같은 패싯을 선택하여 결과 목록을 좁힐 수 있습니다. 문제는 모든 부품에 중요하지 않기 때문에 모든 문서에 엔진 크기가있는 것은 아닙니다 (Solr의 빈 값). 예를 들어, 엔진 크기는 에어 필터에 거의 중요하지 않습니다. 따라서 사용자가 엔진 크기로 3.5L을 선택하더라도 화면의 에어 필터를 사용자가 선택할 수있는 부분으로 표시하고 싶었습니다. 나는 약간의 검색을했고 다음 패싯 쿼리는 완벽하게 작동합니다.

enginesize:"3.5" OR enginesize:(*:* AND -enginesize:[* TO *]) 

이 쿼리는 3.5와 일치하거나 엔진 크기 필드에 대한 값이없는 레코드와 일치합니다 (값은 중요하지 않으며 자동차에 맞지 않음). 완벽한...

문제: 최근에 차량 속성 필드 다중 제품 필드를 만들었으므로 각 부품의 속성을 목록으로 저장할 수있었습니다. 그런 다음 패싯을 적용했고 잘 작동했습니다. 그러나 위에서 언급 한 쿼리를 적용했을 때 문제가 발생했습니다. 엔진 크기를 선택하면 엔진 크기가있는 문서에만 표시된 문서의 수가 좁아졌지만 엔진 크기에 대한 레코드 (레코드를 평균 문서에 사용) Enginesize에 대한 빈 값 (예 : 문서)을 사용하는 레코드도 표시되지 않았습니다. 위의 동일한 쿼리는 엔진 크기가 단일 값 필드 일 때와 동일한 방식으로 다중 측면에 대해 작동하지 않습니다.

예시:

 <doc> 
  <str name="part">engine mount</str>
  <arr name="enginesize">
   <str/>
   <str/>
   <str>3.5</str>
   <str>3.5</str>
   <str>3.5</str>
   <str>3.5</str>
   <str>3.5</str>
  </arr>
 <doc>

<doc> 
  <str name="part">engine bolt</str>
  <arr name="enginesize">
   <str>6</str>
   <str>6</str>
   <str>6</str>
   <str>6</str>
   <str>6</str>
  </arr>
 <doc>

 <doc> 
  <str name="part">air filter</str>
  <arr name="enginesize">
   <str/>
   <str/>
   <str></str>
   <str></str>
   <str></str>
   <str></str>
   <str></str>
  </arr>
 <doc>

내가 찾고있는 것은 3.5의 엔진 크기를 검색 할 때 위의 문서 1과 3을 뒤로 가져가는 쿼리입니다. 첫 번째 문서 (엔진 마운트)는 내가 찾고있는 다중 필드 "엔진 크기"중 하나의 값을 포함하기 때문에 일치합니다 (필드 중 하나에 3.5를 포함함). 그러나 공기 필터의 세 번째 문서는 빈 때문에 반환되지 않습니다. <str> 가치. 두 번째 문서가 패싯 값과 일치하지 않기 때문에 전혀 반환하고 싶지 않습니다.

기본적으로 주어진 패싯의 빈 문자열 값과 일치하고 실제 값과 일치하는 쿼리를 원하므로 두 문서를 모두 반환합니다.

누군가 문서 1과 문서 3 (엔진 브래킷 및 에어 필터)을 반환하는 쿼리가 있지만 엔진 볼트 문서는 없습니까?

나는 성공하지 않고 다음을 시도했다 (이 질문의 맨 위에있는 것을 포함) :

// returns everything
enginesize:"3.5"    OR  (enginesize:[* TO *] )
// only returns document 1
enginesize:"3.5"    OR  (enginesize:["" TO ""] AND -enginesize:"3.5")
// only returns document 1
enginesize:"3.5" OR (enginesize:"")

CSV 파일을 사용하여 위의 데이터를 가져 왔는데 필드를 설정했습니다. keepEmpty=true. CSV 파일을 생성했을 때 공간을 수동으로 수동으로 삽입했습니다 ( <str> </str>, 이전 대신 대신 쿼리를 ret습니다. 그렇게하면 다음과 같은 결과를 얻었습니다.

// returns document 1
enginesize:"3.5" OR enginesize:(*:* AND -enginesize:[* TO *])
// returns all documents
enginesize:"3.5"    OR  (enginesize:["" TO ""] AND -enginesize:"3.5")
// returns all documents
enginesize:"3.5" OR (enginesize:"")

내가 빈 가치로 공간이 있거나 전혀 가치가 없는지 여부에 관계없이 두 상황에서 효과가있는 쿼리가 있습니까?

도움이 되었습니까?

해결책

쿼리 대신 색인을 변경하는 것은 어떻습니까?

"엔진 크기"를 공허한 레코드로 색인하려고하는 대신 "Aly"로 색인하십시오.

그런 다음 쿼리는 단순히 엔진 크기가됩니다 : "3.5"또는 (엔진 크기 : Aly)

다른 팁

나는 방금 이것을 가지고 놀았고 a를 찾았습니다 힌트 그것은 나를 위해 속임수를하는 것 같습니다. 쿼리로 번역되어 있어야합니다.

enginesize:"3.5" OR (-enginesize:["" TO *])

HTH,

그리고 나


업데이트 : 더 많은 테스트 후에 나는 이것이 안정적으로 작동하지 않는다고 생각하지 않습니다. 일부 인덱스의 경우 다른 방법으로 마이너스 부호가 없어야합니다. enginesize:[* TO ""]. 이는 다중 값 또는 실제 값에 대한 인덱스 유형에 따라 다를 수 있습니다.

어쨌든 그것은 너무 많은 해킹처럼 보입니다. 나는 아마도 빈 값을 특별한 마커로 대체하기로 결심 할 것입니다 ...

나는 같은 문제가 있었지만 해결했다. https://stackoverflow.com/a/35633038/13365:

enginesize:"3.5" OR (*:* NOT enginesize:["" TO *])

그만큼 -enginesize 솔루션은 저에게 효과가 없었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top