문제

내 테스트에서 나는 더 많은 조항 예외에 부딪쳤다.

나는 그물 주위를 검색했고 발견 된 자원을 찾았다.
이것은 나에게 비린내 들린다 .. 나는 그것을 무엇으로 올라야합니까? 이 새로운 마법 번호가 내 쿼리에 충분하다는 것을 어떻게 의존 할 수 있습니까? 모든 지옥이 풀리기 전에이 숫자를 얼마나 많이 증가시킬 수 있습니까?

일반적으로 나는 이것이 해결책이 아니라고 생각합니다. 더 깊은 문제가 있어야합니다 ..

쿼리는 +{ +CompanyName : Mercedes +PaintCode : A*}이고 인덱스에는 ~ 2.5m 문서가 있습니다.

도움이 되었습니까?

해결책

PaintCode : A* 쿼리의 일부는 "A"로 시작하는 페인트 코드의 접두사 쿼리입니다. 그것이 당신이 목표로하는 것입니까?

Lucene은 접두사 쿼리를 접두사와 일치하는 모든 가능한 용어를 포함하는 부울 쿼리로 확장합니다. 귀하의 경우 1024 개 이상이 가능합니다. paintCode"a"로 시작하는 s.

만약 당신에게 접두사 쿼리가 쓸모가 없다고 생각한다면, 당신은 진실과 그리 멀지 않습니다.

접두사 쿼리를 사용하지 않도록 색인 체계를 변경하는 것이 좋습니다. 예제로 무엇을 달성하려고하는지 잘 모르겠지만 첫 글자로 페인트 코드를 검색하려면 PaintCodeFirstletter 필드를 만들고 해당 필드에서 검색하십시오.

추가

필사적이고 부분적인 결과를 기꺼이 받아들이려면 소스에서 자신의 Lucene 버전을 만들 수 있습니다. 파일을 변경해야합니다 PrefixQuery.java 그리고 MultiTermQuery.java, 둘 다 org/apache/lucene/search. 에서 rewrite 두 클래스의 방법, 선을 변경하십시오

query.add(tq, BooleanClause.Occur.SHOULD);          // add to query

에게

try {
    query.add(tq, BooleanClause.Occur.SHOULD);          // add to query
} catch (TooManyClauses e) {
    break;
}

나는 내 자신의 프로젝트를 위해 이것을했고 그것은 작동합니다.

루센을 바꾸는 아이디어가 마음에 들지 않으면 자신의 접두사 변형과 자신의 쿼리 파서를 쓸 수 있지만 훨씬 나아질 것이라고 생각하지 않습니다.

다른 팁

당신이 일종의 필드에서 이것을 사용하는 것 같습니다. 예어 유형 (데이터 소스 필드에 여러 토큰이 없음을 의미합니다).

여기에 나에게 꽤 우아한 제안이 있습니다. http://grokbase.com/t/lucene.apache.org/java-user/2007/11/substring-indexing-to-avoid-tonyclauses-exception/12f7s7kzp2emktbn66tdmfpcxfya

기본 아이디어는 조항 한계에 도달하지 않을 때까지 길이가 증가하는 여러 필드로 용어를 분해하는 것입니다.

예시:

다음과 같은 페인트 코드를 상상해보십시오.

"a4c2d3"

이 값을 색인화 할 때 문서에서 다음 필드 값을 만듭니다.

[paintCode]: "a4c2d3"

[paintCode1n]: "a"

[paintCode2n]: "a4"

[paintCode3n]: "a4c"

쿼리 할 때, 학기의 문자 수는 검색 할 필드를 결정합니다. 이것은 접두사 쿼리를 수행한다는 것을 의미합니다 3 자 이상의 용어는 내부 결과 수를 크게 줄여 악명 높은 것을 방지합니다. Toomanybooleanclausesexception. 분명히 이것은 검색 프로세스 속도를 높입니다.

용어를 자동으로 분류하는 프로세스를 쉽게 자동화하고 인덱싱 중에 이름 체계에 따라 문서를 값으로 채울 수 있습니다.

각 필드마다 여러 개의 토큰이 있으면 일부 문제가 발생할 수 있습니다. 기사에서 자세한 내용은 찾을 수 있습니다

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