学习地址:
https://segmentfault.com/a/1190000003101607
http://yijun1171.github.io/2014/12/06/Lucene%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/
http://www.cnblogs.com/forfuture1978/archive/2009/12/14/1623594.html
添加依赖:
-
<dependency>
-
<groupId>org.apache.lucene</groupId>
-
<artifactId>lucene-core</artifactId>
-
<version>4.3.1</version>
-
</dependency>
-
<dependency>
-
<groupId>org.apache.lucene</groupId>
-
<artifactId>lucene-queryparser</artifactId>
-
<version>4.3.1</version>
-
</dependency>
-
<dependency>
-
<groupId>org.apache.lucene</groupId>
-
<artifactId>lucene-queries</artifactId>
-
<version>4.3.1</version>
-
</dependency>
-
<dependency>
-
<groupId>org.apache.lucene</groupId>
-
<artifactId>lucene-highlighter</artifactId>
-
<version>4.3.1</version>
-
</dependency>
-
<dependency>
-
<groupId>org.apache.lucene</groupId>
-
<artifactId>lucene-analyzers-smartcn</artifactId>
-
<version>4.3.1</version>
-
</dependency>
-
<dependency>
-
<groupId>org.apache.lucene</groupId>
-
<artifactId>lucene-analyzers-common</artifactId>
-
<version>4.3.1</version>
-
</dependency>
索引基本使用
1.创建索引和搜索
-
import java.io.File;
-
import java.io.IOException;
-
-
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.Store;
-
import org.apache.lucene.document.IntField;
-
import org.apache.lucene.document.StringField;
-
import org.apache.lucene.document.TextField;
-
import org.apache.lucene.index.DirectoryReader;
-
import org.apache.lucene.index.IndexWriter;
-
import org.apache.lucene.index.IndexWriterConfig;
-
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
-
import org.apache.lucene.queryparser.classic.ParseException;
-
import org.apache.lucene.queryparser.classic.QueryParser;
-
import org.apache.lucene.search.IndexSearcher;
-
import org.apache.lucene.search.Query;
-
import org.apache.lucene.search.TopDocs;
-
import org.apache.lucene.store.Directory;
-
import org.apache.lucene.store.FSDirectory;
-
import org.apache.lucene.util.Version;
-
-
public class Index {
-
public static void main(String[] args) {
-
Index index = new Index();
-
index.createIndex();
-
index.search();
-
}
-
-
public void createIndex() {
-
-
-
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_43);
-
-
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_43, analyzer);
-
-
indexWriterConfig.setOpenMode(OpenMode.CREATE_OR_APPEND);
-
-
Directory directory = null;
-
IndexWriter indexWriter = null;
-
try {
-
directory = FSDirectory.open(new File("Lucene_index/test"));
-
-
-
if (IndexWriter.isLocked(directory)) {
-
IndexWriter.unlock(directory);
-
}
-
-
indexWriter = new IndexWriter(directory, indexWriterConfig);
-
} catch (IOException e) {
-
e.printStackTrace();
-
}
-
-
-
Document doc1 = new Document();
-
doc1.add(new StringField("id", "abcde", Store.YES));
-
doc1.add(new TextField("content", "使用Lucene实现全文检索", Store.YES));
-
doc1.add(new IntField("num", 1, Store.YES));
-
-
-
try {
-
indexWriter.addDocument(doc1);
-
} catch (IOException e) {
-
e.printStackTrace();
-
}
-
-
Document doc2 = new Document();
-
doc2.add(new StringField("id", "yes", Store.YES));
-
doc2.add(new TextField("content", "Docker容器技术简介", Store.YES));
-
doc2.add(new IntField("num", 2, Store.YES));
-
try {
-
indexWriter.addDocument(doc2);
-
} catch (IOException e) {
-
e.printStackTrace();
-
}
-
-
-
try {
-
indexWriter.commit();
-
} catch (IOException e) {
-
e.printStackTrace();
-
} finally {
-
try {
-
indexWriter.close();
-
directory.close();
-
} catch (IOException e) {
-
e.printStackTrace();
-
}
-
}
-
}
-
-
public void search() {
-
Directory directory = null;
-
DirectoryReader dReader = null;
-
try {
-
directory = FSDirectory.open(new File("Lucene_index/test"));
-
dReader = DirectoryReader.open(directory);
-
IndexSearcher searcher = new IndexSearcher(dReader);
-
-
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_43);
-
-
-
QueryParser parser = new QueryParser(Version.LUCENE_43, "content", analyzer);
-
Query query = parser.parse("Docker");
-
-
-
TopDocs topDocs = searcher.search(query, 10);
-
if (topDocs != null) {
-
System.out.println("符合条件的文档总数为:" + topDocs.totalHits);
-
for (int i = 0; i < topDocs.scoreDocs.length; i++) {
-
Document doc = searcher.doc(topDocs.scoreDocs[i].doc);
-
System.out.println(
-
"id = " + doc.get("id") + ",content = " + doc.get("content") + ",num = " + doc.get("num"));
-
}
-
}
-
} catch (IOException e) {
-
e.printStackTrace();
-
} catch (ParseException e) {
-
e.printStackTrace();
-
} finally {
-
try {
-
dReader.close();
-
directory.close();
-
} catch (IOException e) {
-
e.printStackTrace();
-
}
-
}
-
}
-
}
2.分词器对比
-
import java.io.IOException;
-
import java.io.StringReader;
-
-
import org.apache.lucene.analysis.Analyzer;
-
import org.apache.lucene.analysis.TokenStream;
-
import org.apache.lucene.analysis.cjk.CJKAnalyzer;
-
import org.apache.lucene.analysis.core.KeywordAnalyzer;
-
import org.apache.lucene.analysis.core.SimpleAnalyzer;
-
import org.apache.lucene.analysis.core.StopAnalyzer;
-
import org.apache.lucene.analysis.core.WhitespaceAnalyzer;
-
import org.apache.lucene.analysis.standard.StandardAnalyzer;
-
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
-
import org.apache.lucene.util.Version;
-
import org.wltea.analyzer.lucene.IKAnalyzer;
-
-
public class AnalyzerTest {
-
public static void main(String[] args) {
-
AnalyzerTest test=new AnalyzerTest();
-
test.testAnalyzer();
-
}
-
-
public void testAnalyzer() {
-
-
final String str = "今天的生活是因为你三年前的选择,而今天的选择,将决定你三年后的生活。";
-
Analyzer analyzer = null;
-
-
analyzer = new StandardAnalyzer(Version.LUCENE_43);
-
print(analyzer, str);
-
analyzer = new IKAnalyzer();
-
print(analyzer, str);
-
analyzer = new WhitespaceAnalyzer(Version.LUCENE_43);
-
print(analyzer, str);
-
analyzer = new SimpleAnalyzer(Version.LUCENE_43);
-
print(analyzer, str);
-
analyzer = new CJKAnalyzer(Version.LUCENE_43);
-
print(analyzer, str);
-
analyzer = new KeywordAnalyzer();
-
print(analyzer, str);
-
analyzer = new StopAnalyzer(Version.LUCENE_43);
-
print(analyzer, str);
-
-
}
-
-
-
-
-
-
-
-
-
-
public void print(Analyzer analyzer, String str) {
-
-
StringReader stringReader = new StringReader(str);
-
try {
-
TokenStream tokenStream = analyzer.tokenStream("", stringReader);
-
tokenStream.reset();
-
-
CharTermAttribute term = tokenStream.getAttribute(CharTermAttribute.class);
-
System.out.println("分词技术:" + analyzer.getClass());
-
while (tokenStream.incrementToken()) {
-
System.out.print(term.toString() + "|");
-
}
-
System.out.println();
-
} catch (IOException e) {
-
e.printStackTrace();
-
}
-
}
-
}
结果:
分词技术:class org.apache.lucene.analysis.standard.StandardAnalyzer
今|天|的|生|活|是|因|为|你|三|年|前|的|选|择|而|今|天|的|选|择|将|决|定|你|三|年|后|的|生|活|
分词技术:class org.wltea.analyzer.lucene.IKAnalyzer
今天|的|生活|是因为|因为|你|三年|三|年前|年|前|的|选择|而今|今天|的|选择|将|决定|你|三年|三|年后|年|后|的|生活|
分词技术:class org.apache.lucene.analysis.core.WhitespaceAnalyzer
今天的生活是因为你三年前的选择,而今天的选择,将决定你三年后的生活。|
分词技术:class org.apache.lucene.analysis.core.SimpleAnalyzer
今天的生活是因为你三年前的选择|而今天的选择|将决定你三年后的生活|
分词技术:class org.apache.lucene.analysis.cjk.CJKAnalyzer
今天|天的|的生|生活|活是|是因|因为|为你|你三|三年|年前|前的|的选|选择|而今|今天|天的|的选|选择|将决|决定|定你|你三|三年|年后|后的|的生|生活|
分词技术:class org.apache.lucene.analysis.core.KeywordAnalyzer
今天的生活是因为你三年前的选择,而今天的选择,将决定你三年后的生活。|
分词技术:class org.apache.lucene.analysis.core.StopAnalyzer
今天的生活是因为你三年前的选择|而今天的选择|将决定你三年后的生活|
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29254281/viewspace-1974653/
,如需转载,请注明出处,否则将追究法律责任。