一 利用Jcseg分词器构建索引
public class LuceneJcsegIndex {
public static void main(String[] args) {
String[] ids = new String[] { "1", "2", "3", "4" };
String[] names = new String[] { "北京", "北京海淀", "南京", "shanghai" };
String[] values = new String[] { "lang", "deg", "men", "context" };
String[] bir = new String[] { "198108", "197906", "191111", "198710" };
try {
String dir = "D:\\user";
// 目录
Directory directory = new SimpleFSDirectory(new File(dir));
Analyzer analyzer = new JcsegAnalyzer4X(JcsegTaskConfig.COMPLEX_MODE);
JcsegAnalyzer4X jcseg = (JcsegAnalyzer4X) analyzer;
JcsegTaskConfig jcsegTaskConfig = jcseg.getTaskConfig();
jcsegTaskConfig.setAppendCJKPinyin(true);
jcsegTaskConfig.setAppendCJKSyn(true);
IndexWriter indexWriter = new IndexWriter(directory,
new IndexWriterConfig(Version.LUCENE_44, analyzer));
for (int i = 0; i < ids.length; i++) {
Document document = new Document();
document.add(new IntField("id", Integer.parseInt(ids[i]),
Store.YES));
document.add(new StringField("name", names[i], Store.YES));
document.add(new TextField("text", values[i], Store.YES));
document.add(new StringField("datetime", bir[i], Store.YES));
indexWriter.addDocument(document);
}
indexWriter.commit();
indexWriter.close();
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
二 根据名称查询
Term term = new Term("name", "北京");
查询结果:
北京
lang
198108
三 测试QueryParse
package com.zsj.test;
import java.io.File;
import java.io.IOException;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexReader;
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.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import com.webssky.jcseg.core.JcsegTaskConfig;
import com.webssky.jcseg.lucene.JcsegAnalyzer4X;
/**
* 测试Lucene 4.4简单搜索
*
* @author hadoop
*
*/
public class LuceneJcsegQueryParse {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String dir = "D:\\user";
try {
Directory directory = FSDirectory.open(new File(dir));
@SuppressWarnings("deprecation")
IndexReader reader = IndexReader.open(directory);
IndexSearcher indexSearcher = new IndexSearcher(reader);
/**
* 创建搜索字段
*/
Analyzer analyzer = new JcsegAnalyzer4X(
JcsegTaskConfig.COMPLEX_MODE);
JcsegAnalyzer4X jcseg = (JcsegAnalyzer4X) analyzer;
JcsegTaskConfig jcsegTaskConfig = jcseg.getTaskConfig();
jcsegTaskConfig.setAppendCJKPinyin(true);
jcsegTaskConfig.setAppendCJKSyn(true);
QueryParser queryParser = new QueryParser(Version.LUCENE_44,
"name", analyzer);
//Test AND NOT
Query query = queryParser.parse("text:men AND NOT name:南京");
//Test AND
//Query query = queryParser.parse("text:men AND name:南京");
// Term term = new Term("name", "北京");
// TermQuery termQuery = new TermQuery(term);
TopDocs topDocs = indexSearcher.search(query, 4);
ScoreDoc scoreDocs[] = topDocs.scoreDocs;
for (int i = 0; i < scoreDocs.length; i++) {
Document document = indexSearcher.doc(scoreDocs[i].doc);
System.out.println(document.get("id"));
System.out.println(document.get("name"));
System.out.println(document.get("text"));
System.out.println(document.get("datetime"));
}
directory.close();
} catch (IOException | ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}