수색…


부울 쿼리

BooleanQuery는 다른 쿼리를 결합하는 데 사용됩니다.

다음 세 개의 BooleanClause.Occur 매개 변수를 사용하여 결합 할 수 있습니다.

  • BooleanClause.Occur.MUST - 하위 쿼리가 일치해야합니다.
  • BooleanClause.Occur.SHOULD - 하위 쿼리가 일치하지 않을 수도 있지만 더 높은 점수가 매겨집니다. 만약 MUST 절이 없다면 적어도 하나의 SHOULD 절이 일치해야한다.
  • BooleanClause.Occur.MUST_NOT - 하위 쿼리가 문서와 일치해서는 안됩니다.

이 예에서 문서는 "중요"하지만 "금지" 하지 않으면 일치하고, "도움이"되면 높은 점수를 얻습니다.

Query importantQuery = new TermQuery(new Term("fieldname", "important"));
Query optionalQuery = new TermQuery(new Term("fieldname", "helpful"));
Query forbidQuery = new TermQuery(new Term("fieldname", "forbidden"));
BooleanQuery query = new BooleanQuery.Builder()
        .add(importantQuery, BooleanClause.Occur.MUST) 
        .add(optionalQuery, BooleanClause.Occur.SHOULD) 
        .add(forbidQuery, BooleanClause.Occur.MUST_NOT) 
        .build();

또는 일치해야하는 최소 절 수를 지정할 수도 있습니다.

Query query1 = new TermQuery(new Term("fieldname", "one"));
Query query2 = new TermQuery(new Term("fieldname", "two"));
Query query3 = new TermQuery(new Term("fieldname", "three"));
BooleanQuery query = new BooleanQuery.Builder()
        .add(query1, BooleanClause.Occur.SHOULD) 
        .add(query2, BooleanClause.Occur.SHOULD) 
        .add(query3, BooleanClause.Occur.SHOULD)
        .setMinimumNumberShouldMatch(2)
        .build();

Gotcha : BooleanClause.Occur.MUST_NOT 가있는 절은 다른 모든 항목과 일치 하지 않으므로 일치 항목 만 제거됩니다. BooleanQuery에는 MUST 하나 이상의 MUST 또는 SHOULD 절이 MUST 하며 그렇지 않으면 아무 것도 일치하지 않습니다. 예를 들어,이 기능은 작동 하지 않습니다 .

//***This does NOT work!***
Query forbidQuery = new TermQuery(new Term("fieldname", "forbidden"));
BooleanQuery getEverythingElseQuery = new BooleanQuery.Builder()
        .add(forbidQuery, BooleanClause.Occur.MUST_NOT) 
        .build();

구문 검색

PhraseQuery는 일련의 용어를 검색하는 데 사용됩니다. 다음은 "Hello World"구문과 일치합니다 ( StandardAnalyzer 로 색인 된 후).

Query query = new PhraseQuery.Builder()
        .add(new Term("text", "hello"))
        .add(new Term("text", "world"))
        .build();

PhraseQuery는 최대로 설정하여 쿼리 내에서 "슬롭", 또는 추가 조건을 처리 할 수있는 편집 거리setSlop . 이것은 "Lorem ipsum sit amet dolor"과 일치합니다 :

Query query = new PhraseQuery.Builder()
        .add(new Term("text", "lorem"))
        .add(new Term("text", "amet"))
        .setSlop(2)
        .build();

정확한 위치 증가를 설정할 수도 있습니다.

Query query = new PhraseQuery.Builder()
        .add(new Term("text", "lorem"), 0)
        .add(new Term("text", "sit"), 2)
        .add(new Term("text", "dolor"), 4)
        .build();

DisjunctionMaxQuery

이 쿼리는 하위 쿼리의 최상 (즉, 최고 득점) 일치가 최종 점수에 기여하도록 쿼리를 결합합니다.

List<Query> disjuncts = new ArrayList<Query>();
disjuncts.add(new TermQuery(new Term("fieldname", "hello")));
disjuncts.add(new TermQuery(new Term("fieldname", "world")));
Query query = new DisjunctionMaxQuery(disjuncts, 0.0f);

DisjunctionMaxQuery 생성자에 대한 두 번째 인수는 tiebreaker 값입니다.이 값이 0이 아닌 경우 최대가 아닌 일치 항목이 점수에 약간의 기여를하도록 허용하여 연결을 끊습니다. 그것은 일반적으로 작아야합니다 (0.1 정도).

검색어 높이기

다른 서브 쿼리와 비교하여 점수를 높이기 위해 쿼리를 강화할 수 있습니다. 이것은 BoostQuery로 감싸는 것으로 끝난다.

Query lessRelevantQuery = new TermQuery(new Term("fieldname", "ipsum"));
//Five times as interesting
Query highlyRelevantQuery = new BoostQuery(
         new TermQuery(new Term("fieldname", "lorem")), 
         5.0f);
BooleanQuery query = new BooleanQuery.Builder()
        .add(lessRelevantQuery, BooleanClause.Occur.SHOULD) 
        .add(highlyRelevantQuery, BooleanClause.Occur.SHOULD) 
        .build();


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow