Lucene 쿼리 대상 분석 (1)

Lucene은 개발자에게 다음과 같은 다양한 쿼리 방법을 제공하는 오픈 소스 검색 키트로 다음과 같이 요약되어 있습니다.
 
첫 번째:TermQuery.TermQuery는 Lucene에서 가장 기본적인 원자 조회이다.개발자는 색인에 지정된 단어가 들어 있는 Document를 읽어들일 수 있습니다.코드는 다음과 같습니다.
public static void main(String[] args) throws IOException {

		createIndex();

		termQuery();
		
}


private static void createIndex() throws IOException {
		IndexWriter writer = new IndexWriter(STORE_PATH,
				new StandardAnalyzer(), true);
		writer.setUseCompoundFile(false);
		Document doc1 = new Document();
		Document doc2 = new Document();
		Field field = new Field("PostTitle", "Lucene    ", Field.Store.YES,
				Field.Index.TOKENIZED);
		Field field1 = new Field("PostContent", "Lucene           ",
				Field.Store.YES, Field.Index.TOKENIZED);
		doc1.add(field);
		doc1.add(field1);

		Field field2 = new Field("PostTitle", "     ", Field.Store.YES,
				Field.Index.TOKENIZED);
		Field field3 = new Field("PostContent",
				"         Web    ,                  ", Field.Store.NO,
				Field.Index.TOKENIZED);
		doc2.add(field2);
		doc2.add(field3);
		writer.addDocument(doc1);
		writer.addDocument(doc2);
		writer.close();
}

private static void termQuery() throws IOException {

		IndexSearcher searcher = new IndexSearcher(STORE_PATH);
		Term term = new Term("PostContent", "lucene");
		Query termQuery = new TermQuery(term);
		Hits hits = searcher.search(termQuery);
		System.out.println("TermQuery demo------");
		System.out.println("hits.length()==" + hits.length());
		for (int i = 0; i < hits.length(); i++) {

			System.out.println(hits.doc(i));
		}
}
TermQuery demo------
hits.length()==1
Document<stored/uncompressed,indexed,tokenized<PostTitle:Lucene    > stored/uncompressed,indexed,tokenized<PostContent:Lucene           >>



두 번째: BooleanQuery.볼 조회는 사실 각종 조회의 결과를 다시 볼 연산하여 마지막에 조회 결과를 얻는 것이다.그 중에서 구체적인 조합 방식은 다음과 같다.
    1 MUST,MUST
    2 MUST,MUST_NOT
    3 MUST_SHOULD
    4 MUST_NOT,SHOULD.
    5 SHOULD,SHOULD
    6  MUST_NOT,MUST_NOT
구체적인 코드는 다음과 같습니다.
 
public static void main(String[] args) throws IOException {

		createIndex();

		booleanQuery();
		
}

private static void booleanQuery() throws IOException {

		IndexSearcher searcher = new IndexSearcher(STORE_PATH);

		Term term1 = new Term("PostTitle", " ");
		Term term2 = new Term("PostContent", " ");

		TermQuery termquery1 = new TermQuery(term1);
		TermQuery termquery2 = new TermQuery(term2);

		BooleanQuery query = new BooleanQuery();
		query.add(termquery1, BooleanClause.Occur.MUST);
		query.add(termquery2, BooleanClause.Occur.MUST);
		Hits hits = searcher.search(query);
		System.out.println("BooleanQuery demo with MUST and MUST -------");
		System.out.println("hits.length()==" + hits.length());
		for (int i = 0; i < hits.length(); i++) {

			System.out.println(hits.doc(i));
		}
		System.out.println("-----------------------------------");

		BooleanQuery query1 = new BooleanQuery();
		query1.add(termquery1, BooleanClause.Occur.MUST);
		query1.add(termquery2, BooleanClause.Occur.MUST_NOT);
		Hits hits1 = searcher.search(query1);
		System.out.println("BooleanQuery demo with MUST and MUST_NOT -------");
		System.out.println("hits.length()==" + hits1.length());
		for (int i = 0; i < hits1.length(); i++) {

			System.out.println(hits1.doc(i));
		}

		System.out.println("-----------------------------------");

		BooleanQuery query2 = new BooleanQuery();
		query2.add(termquery1, BooleanClause.Occur.SHOULD);
		query2.add(termquery2, BooleanClause.Occur.MUST_NOT);
		Hits hits2 = searcher.search(query2);
		System.out.println("BooleanQuery demo with SHOULD and MUST_NOT -------");
		System.out.println("hits.length()==" + hits2.length());
		for (int i = 0; i < hits2.length(); i++) {

			System.out.println(hits2.doc(i));
		}
		
		System.out.println("-----------------------------------");
		
	    Term term3 = new Term("PostTitle","lucene");
		Term term4 = new Term("PostContent"," ");
		TermQuery termquery3 = new TermQuery(term3);
		TermQuery termquery4 = new TermQuery(term4);
		
	    BooleanQuery query3 = new BooleanQuery();
		query3.add(termquery3, BooleanClause.Occur.SHOULD);
		query3.add(termquery4, BooleanClause.Occur.SHOULD);
		Hits hits3 = searcher.search(query3);
		System.out.println("BooleanQuery demo with SHOULD and SHOULD -------");
		System.out.println("hits.length()==" + hits3.length());
		for (int i = 0; i < hits3.length(); i++) {

			System.out.println(hits3.doc(i));
		}
}

 
실행 결과는 다음과 같습니다.
 
BooleanQuery demo with MUST and MUST -------
hits.length()==1
Document<stored/uncompressed,indexed,tokenized<PostTitle:Lucene    > stored/uncompressed,indexed,tokenized<PostContent:Lucene           >>
-----------------------------------
BooleanQuery demo with MUST and MUST_NOT -------
hits.length()==1
Document<stored/uncompressed,indexed,tokenized<PostTitle:     >>
-----------------------------------
BooleanQuery demo with SHOULD and MUST_NOT -------
hits.length()==1
Document<stored/uncompressed,indexed,tokenized<PostTitle:     >>
-----------------------------------
BooleanQuery demo with SHOULD and SHOULD -------
hits.length()==2
Document<stored/uncompressed,indexed,tokenized<PostTitle:Lucene    > stored/uncompressed,indexed,tokenized<PostContent:Lucene           >>
Document<stored/uncompressed,indexed,tokenized<PostTitle:     >>

 
 
여기서 Should와 must를 조합할 때 검색 결과는 must의 결과이고 mustnot 결합 시 must와 mustnot.
 
세 번째: RangeQuery.범위 조회 고명사는 하나의 방향을 정하여 조회하는 것이다. 예를 들어 조회 사용자 ID가'10001-10005'사이의 사용자 등이다.구체적인 코드는 다음과 같습니다.
 
private static void rangeQuery() throws IOException {

		IndexWriter writer = new IndexWriter(STORE_PATH,
				new StandardAnalyzer(), true);
		Field field1 = new Field("userID", "10001", Field.Store.YES,
				Field.Index.TOKENIZED);
		Field field2 = new Field("userID", "10002", Field.Store.YES,
				Field.Index.TOKENIZED);
		Field field3 = new Field("userID", "10003", Field.Store.YES,
				Field.Index.TOKENIZED);
		Field field4 = new Field("userID", "10004", Field.Store.YES,
				Field.Index.TOKENIZED);
		Field field5 = new Field("userID", "10005", Field.Store.YES,
				Field.Index.TOKENIZED);
		Document doc1 = new Document();
		Document doc2 = new Document();
		Document doc3 = new Document();
		Document doc4 = new Document();
		Document doc5 = new Document();
		doc1.add(field1);
		doc2.add(field2);
		doc3.add(field3);
		doc4.add(field4);
		doc5.add(field5);

		writer.addDocument(doc1);
		writer.addDocument(doc2);
		writer.addDocument(doc3);
		writer.addDocument(doc4);
		writer.addDocument(doc5);

		writer.close();

		IndexSearcher searcher = new IndexSearcher(STORE_PATH);
		Term start = new Term("userID", "10001");
		Term end = new Term("userID", "10002");

		RangeQuery query = new RangeQuery(start, end, true);

		Hits hits = searcher.search(query);
		System.out.println("RangeQuery demo------");
		System.out.println("hits.length()==" + hits.length());
		for (int i = 0; i < hits.length(); i++) {

			System.out.println(hits.doc(i));
		}
	}

 
 
실행 결과는 다음과 같습니다.
RangeQuery demo------
hits.length()==5
Document<stored/uncompressed,indexed,tokenized<userID:10001>>
Document<stored/uncompressed,indexed,tokenized<userID:10002>>
Document<stored/uncompressed,indexed,tokenized<userID:10003>>
Document<stored/uncompressed,indexed,tokenized<userID:10004>>
Document<stored/uncompressed,indexed,tokenized<userID:10005>>

그 중에서 RangeQuery 구조 함수의 세 번째 매개 변수는 경계 값을 포함할지 여부를 지정하는 데 사용되며,true라면 닫힌 구간이고,false라면 열린 구간이다.

좋은 웹페이지 즐겨찾기