学习来源
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!-- lucene核心库 -->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>${lunece.version}</version>
</dependency>
<!-- Lucene的查询解析器 -->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-queryparser</artifactId>
<version>${lunece.version}</version>
</dependency>
<!-- lucene的默认分词器库 -->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-analyzers-common</artifactId>
<version>${lunece.version}</version>
</dependency>
<!-- lucene的高亮显示 -->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-highlighter</artifactId>
<version>${lunece.version}</version>
</dependency>
<!--ik分词器-->
<dependency>
<groupId>com.janeluo</groupId>
<artifactId>ikanalyzer</artifactId>
<version>2012_u6</version>
</dependency>
package com.example.demo;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.*;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.*;
import org.apache.lucene.search.highlight.Formatter;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.junit.Test;
import org.wltea.analyzer.core.IKSegmenter;
import org.wltea.analyzer.core.Lexeme;
import org.wltea.analyzer.lucene.IKAnalyzer;
import java.io.File;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Collection;
public class TestClassLuence {
@Test
public void testCreate() throws Exception {
Document document = new Document();
document.add(new StringField("id", "1", Field.Store.YES));
document.add(new TextField("title", "谷歌地图之父跳槽facebook", Field.Store.YES));
Directory directory = FSDirectory.open(new File("f:\\indexDir"));
Analyzer analyzer = new StandardAnalyzer();
IndexWriterConfig conf = new IndexWriterConfig(Version.LATEST, analyzer);
IndexWriter indexWriter = new IndexWriter(directory, conf);
indexWriter.addDocument(document);
indexWriter.commit();
indexWriter.close();
}
@Test
public void testCreate2() throws Exception {
Collection<Document> docs = new ArrayList<>();
Document document1 = new Document();
document1.add(new StringField("id", "1", Field.Store.YES));
document1.add(new TextField("title", "谷歌地图", Field.Store.YES));
docs.add(document1);
Document document2 = new Document();
document2.add(new StringField("id", "2", Field.Store.YES));
document2.add(new TextField("title", "谷歌地图之父加盟FaceBook", Field.Store.YES));
docs.add(document2);
Document document3 = new Document();
document3.add(new StringField("id", "3", Field.Store.YES));
document3.add(new TextField("title", "谷歌地图创始人拉斯离开谷歌加盟Facebook", Field.Store.YES));
docs.add(document3);
Document document4 = new Document();
document4.add(new StringField("id", "4", Field.Store.YES));
document4.add(new TextField("title", "谷歌地图之父跳槽Facebook与Wave项目取消有关", Field.Store.YES));
docs.add(document4);
Document document5 = new Document();
document5.add(new StringField("id", "5", Field.Store.YES));
document5.add(new TextField("title", "谷歌地图之父拉斯加盟社交网站Facebook", Field.Store.YES));
docs.add(document5);
Document document6 = new Document();
document6.add(new StringField("id", "6", Field.Store.YES));
document6.add(new TextField("title", "ASDFGHJKLAAAAAXCVXVXAAC", Field.Store.YES));
docs.add(document6);
Directory directory = FSDirectory.open(new File("f:\\indexDir"));
Analyzer analyzer = new IKAnalyzer();
IndexWriterConfig conf = new IndexWriterConfig(Version.LATEST, analyzer);
conf.setOpenMode(IndexWriterConfig.OpenMode.CREATE);
IndexWriter indexWriter = new IndexWriter(directory, conf);
indexWriter.addDocuments(docs);
indexWriter.commit();
indexWriter.close();
}
@Test
public void testIKQuery() throws Exception {
BooleanQuery querys = new BooleanQuery();
StringReader sr = new StringReader("谷歌地图 Facebook 取消");
IKSegmenter ik = new IKSegmenter(sr,true);
Lexeme lex = null;
while ((lex=ik.next())!=null){
System.out.println(lex.getLexemeText());
Query query = new WildcardQuery(new Term("title", "*"+lex.getLexemeText()+"*"));
querys.add(query, BooleanClause.Occur.MUST);
}
search(querys);
}
@Test
public void testTermQuery() throws Exception {
Query query = new TermQuery(new Term("title", "谷歌加盟"));
search(query);
}
@Test
public void testWildCardQuery() throws Exception {
Query query = new WildcardQuery(new Term("title", "*KL*"));
search(query);
}
@Test
public void testFuzzyQuery() throws Exception {
Query query = new FuzzyQuery(new Term("title", "faceboo,"), 1);
search(query);
}
@Test
public void testNumericRangeQuery() throws Exception {
Query query = NumericRangeQuery.newLongRange("id", 2L, 2L, true, true);
search(query);
}
@Test
public void testBooleanQuery() throws Exception {
Query query1 = new WildcardQuery(new Term("title", "facebook"));
Query query2 = new WildcardQuery(new Term("title", "*谷歌*"));
Query query3 = new WildcardQuery(new Term("title", "*地图*"));
Query query4 = new WildcardQuery(new Term("title", "*取消*"));
BooleanQuery query = new BooleanQuery();
query.add(query1, BooleanClause.Occur.MUST);
query.add(query2, BooleanClause.Occur.MUST);
query.add(query3, BooleanClause.Occur.MUST);
query.add(query4, BooleanClause.Occur.MUST);
search(query);
}
public void search(Query query) throws Exception {
Directory directory = FSDirectory.open(new File("f:\\indexDir"));
IndexReader reader = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(reader);
TopDocs topDocs = searcher.search(query, 10);
System.out.println("本次搜索共找到" + topDocs.totalHits + "条数据");
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
for (ScoreDoc scoreDoc : scoreDocs) {
int docID = scoreDoc.doc;
Document doc = reader.document(docID);
System.out.println("id: " + doc.get("id"));
System.out.println("title: " + doc.get("title"));
System.out.println("得分: " + scoreDoc.score);
}
}
@Test
public void testUpdate() throws Exception {
Directory directory = FSDirectory.open(new File("f:\\indexDir"));
IndexWriterConfig conf = new IndexWriterConfig(Version.LATEST, new IKAnalyzer());
IndexWriter writer = new IndexWriter(directory, conf);
Document doc = new Document();
doc.add(new StringField("id", "1", Field.Store.YES));
doc.add(new TextField("title", "谷歌地图之父跳槽facebook ", Field.Store.YES));
writer.updateDocument(new Term("id", "1"), doc);
writer.commit();
writer.close();
}
@Test
public void testDelete() throws Exception {
Directory directory = FSDirectory.open(new File("f:\\indexDir"));
IndexWriterConfig conf = new IndexWriterConfig(Version.LATEST, new IKAnalyzer());
IndexWriter writer = new IndexWriter(directory, conf);
writer.deleteAll();
writer.commit();
writer.close();
}
@Test
public void testHighlighter() throws Exception {
Directory directory = FSDirectory.open(new File("f:\\indexDir"));
IndexReader reader = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(reader);
QueryParser parser = new QueryParser("title", new IKAnalyzer());
Query query = parser.parse("谷歌地图");
Formatter formatter = new SimpleHTMLFormatter("<em>", "</em>");
QueryScorer scorer = new QueryScorer(query);
Highlighter highlighter = new Highlighter(formatter, scorer);
TopDocs topDocs = searcher.search(query, 10);
System.out.println("本次搜索共" + topDocs.totalHits + "条数据");
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
for (ScoreDoc scoreDoc : scoreDocs) {
int docID = scoreDoc.doc;
Document doc = reader.document(docID);
System.out.println("id: " + doc.get("id"));
String title = doc.get("title");
String hTitle = highlighter.getBestFragment(new IKAnalyzer(), "title", title);
System.out.println("title: " + hTitle);
System.out.println("得分:" + scoreDoc.score);
}
}
@Test
public void testSortQuery() throws Exception {
Directory directory = FSDirectory.open(new File("f:\\indexDir"));
IndexReader reader = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(reader);
QueryParser parser = new QueryParser("title", new IKAnalyzer());
Query query = parser.parse("谷歌地图");
Sort sort = new Sort(new SortField("id", SortField.Type.LONG, true));
TopDocs topDocs = searcher.search(query, 10, sort);
System.out.println("本次搜索共" + topDocs.totalHits + "条数据");
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
for (ScoreDoc scoreDoc : scoreDocs) {
int docID = scoreDoc.doc;
Document doc = reader.document(docID);
System.out.println("id: " + doc.get("id"));
System.out.println("title: " + doc.get("title"));
}
}
@Test
public void testPageQuery() throws Exception {
int pageSize = 2;
int pageNum = 3;
int start = (pageNum - 1) * pageSize;
int end = start + pageSize;
Directory directory = FSDirectory.open(new File("f:\\indexDir"));
IndexReader reader = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(reader);
QueryParser parser = new QueryParser("title", new IKAnalyzer());
Query query = parser.parse("谷歌地图");
Sort sort = new Sort(new SortField("id", SortField.Type.LONG, false));
TopDocs topDocs = searcher.search(query, end, sort);
System.out.println("本次搜索共" + topDocs.totalHits + "条数据");
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
for (int i = start; i < end; i++) {
ScoreDoc scoreDoc = scoreDocs[i];
int docID = scoreDoc.doc;
Document doc = reader.document(docID);
System.out.println("id: " + doc.get("id"));
System.out.println("title: " + doc.get("title"));
}
}
}