2013-02-25 4 views
0

나는 Lucene으로 인덱싱하고있는 List<String> 필드를 포함하는 최대 절전 모드 주석 클래스 TestClass을 가지고 있습니다. 다음 예제를 고려하십시오.최대 절전 모드 목록에서 Lucene 검색

"Foo Bar""Bar Snafu"은 특정 레코드에 대한 목록의 두 항목입니다. 이제 사용자가 "Foo Snafu"에 대한 TestClass를 검색하면 해당 레코드가 발견됩니다. 토큰 Foo와 토큰 Snafu가 모두이 레코드의 List<String>에있는 토큰이기 때문에 추측합니다.

어떻게 이런 일이 발생하지 않도록 할 수 있습니까?

실제 사례는 원고와 피고 명단이있는 법원의 경우입니다. 케이스에 기소 된 두 사람이 있다고 가정 해보십시오 (Joe Lewis BobRobert Clay Smith). 이러한 사용자는 피고의 목록에있는 법원 사건 기록에 저장됩니다. 이 피고들의 목록은 Lucene과 함께 색인되어 있습니다. 이제 사용자가 앞서 언급 한 두 명의 피고 중 하나를 검색하면 사례가 발견됩니다. 사용자가 Lewis Smith 또는 Joe Clay을 검색하는 경우에도 해당 사례가 발견됩니다.

업데이트 : Lucene IRC 채널에서 다중 값 필드를 사용할 수 있다고 언급되었습니다.

업데이트 2 :은 그것은 내가 SOLR으로 이러한 목표를 달성하기 위해 schema.xmlpositionIncrementGap 설정을 사용할 수 SOLR의 IRC 채널에서 언급되었다. 분명히 문구 쿼리 (슬롭 포함 또는 불포함)를 사용하면 "증가 간격이 동일 필드의 다른 값이 의도하지 않은 일치를 발생시키지 않도록합니다".

+0

'foo bar'와 'bar snafu'가 다른 엔티티 인 경우 ... [i] .. 'i'가 카운터 변수 인 경우 ... 'foo bar'만 가리키고 '및'bar snafu '전체적으로 ...'foo snafu '는 엔티티로 존재하지 않습니다 ... 귀하의 질문을 이해하는 한, 이것은 내가 말할 수있는 것입니다. 어쩌면 더 자세히 설명 할 수 있을까요? – Philo

+0

@Philo 오른쪽.하지만 Lucene은 모든 이름을 토큰 화합니다. – theblang

답변

0

Lucene은 필드에 이미있는 것과 동일한 문서의 동일한 필드에 연속적인 추가 내용을 추가합니다.

목록의 각 구성원을 완전히 별개의 엔터티로 취급하려면 여러 필드에 색인을 생성해야합니다. 이미 사용중인 필드 이름에 인덱스를 추가하기 만하면됩니다. 물론 여러분의 필요에 대한 완전한 정보를 얻지는 못했지만, 이와 같은 일을하는 것이 더 나은 해결책 일 것입니다.

정확한 텍스트 "Foo Snafu" 만 검색하려는 경우 PhraseQuery을 사용할 수 있습니다. 당신의 문구가 한 목록 항목에서 다음 항목으로 넘어 가지 않도록하려는 경우 (즉, 색인에 "Bar Foo""Snafu Bar"이있는 경우), 색인 작성시 각 구성원간에 구분 용어를 삽입 할 수 있습니다.

+0

특정 레코드의 목록 크기가 동적이기 때문에 다른 필드를 사용할 수 없습니다. – theblang

관련 문제