Lucene 쿼리 대상 분석 (1)
첫 번째: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라면 열린 구간이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Elasticsearch 호출 Lucene 쿼리 인터페이스 원본 분석 6: 접두사 쿼리(Prefix)소개 조회 문법 원본 분석 접두사 조회는 설정에 있어서 단어 조회와 유사하다.접두사 검색은 이러한 문서와 일치할 수 있습니다. 이 문서의 특정 필드는 주어진 접두사로 시작됩니다. 예: 모든 제목 필드가cri로 시작하...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.