67,513
社区成员
发帖
与我相关
我的任务
分享
@Test
public void testCreate() throws Exception {
Analyzer nameAnalyzer = new StandardAnalyzer(LuceneUtils.VERSION);
Analyzer pinyinAnalyzer = new PinyinAnalyzer(LuceneUtils.VERSION);
Analyzer ikAnalyzer = new IKAnalyzer();
Directory directory = FSDirectory.open(new File("indexDirectory"));
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_46, nameAnalyzer);//只能在索引上指定一个analyzer
config.setOpenMode(OpenMode.CREATE);
IndexWriter indexWriter = new IndexWriter(directory, config);
int _id = 1;
String _name = "张小三";
String _pinyin = "zhang‘xiao’san";
String _desc = "这是一个测试客户张小三";
Document doc = new Document();// 创建文档
doc.add(new StringField("id", _id + "", Store.YES));//我要在哪里用analyzer??
doc.add(new TextField("name", _name, Store.YES));
doc.add(new TextField("pinyin", _pinyin, Store.YES));
doc.add(new TextField("desc", _desc, Store.YES));
indexWriter.addDocument(doc);// 添加文本到索引中
indexWriter.commit();
indexWriter.close();
}
private IndexWriter createIndexWriter(String indexPath, Analyzer analyzer) throws Exception{
Directory directory = FSDirectory.open(new File("D:/index"));
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_46, analyzer);//只能在索引上指定一个analyzer
config.setOpenMode(OpenMode.CREATE);
IndexWriter indexWriter = new IndexWriter(directory, config);
return indexWriter;
}
public void testCreate2(String[][] data) throws Exception {
Analyzer nameAnalyzer = new StandardAnalyzer(LuceneUtils.VERSION);
Analyzer pinyinAnalyzer = new PinyinAnalyzer(LuceneUtils.VERSION);
Analyzer ikAnalyzer = new IKAnalyzer();
IndexWriter nameWriter = createIndexWriter("D:/index/name", nameAnalyzer);
IndexWriter pingyinWriter = createIndexWriter("D:/index/pinyin", pinyinAnalyzer);
IndexWriter descWriter = createIndexWriter("D:/index/desc", ikAnalyzer);
for (int i = 0, len = data.length; i < len; i++) {
Document nameDoc = new Document();// 创建文档
nameDoc.add(new StringField("id", data[i][0], Store.YES));// 我要在哪里用analyzer??
nameDoc.add(new TextField("content", data[i][1], Store.YES));
nameWriter.addDocument(nameDoc);
Document pinyinDoc = new Document();// 创建文档
pinyinDoc.add(new StringField("id", data[i][0], Store.YES));// 我要在哪里用analyzer??
pinyinDoc.add(new TextField("content", data[i][2], Store.YES));
pingyinWriter.addDocument(pinyinDoc);
Document descDoc = new Document();// 创建文档
descDoc.add(new StringField("id", data[i][0], Store.YES));// 我要在哪里用analyzer??
descDoc.add(new TextField("content", data[i][3], Store.YES));
descWriter.addDocument(descDoc);
}
nameWriter.commit();
nameWriter.close();
pingyinWriter.commit();
pingyinWriter.close();
descWriter.commit();
descWriter.close();
}
@Test
public void test2() {
String[][] data = { { "1", "张小三", "zhang'xiao'san", "这是一个测试客户张小三" },
{ "2", "李大四", "li'da'si", "第二个用户大李四" },
{ "3", "张四", "zhang'si", "最后的客户四张" } };
}
public static IndexReader getReader(String indexPath) throws IOException {
return DirectoryReader.open(FSDirectory.open(new File(indexPath)));// 索引读取类
}
public void show(IndexSearcher searcher, TopDocs topdocs, String... fields) throws IOException {
ScoreDoc[] scoreDoc = topdocs.scoreDocs;
int len = scoreDoc.length;
System.out.println("检索结果 共 : " + len);
for (int i = 0; i < len; i++) {
ScoreDoc sd = scoreDoc[i];
System.out.println("得分 score = " + sd.score);
Document doc = searcher.doc(sd.doc);
for (int k = 0, klen = fields.length; k < klen; k++) {
System.out.println(fields[k] + " === " + doc.get(fields[k]));
}
}
}
@Test
public void query3() throws Exception {
String queryStr = "张三";
IndexReader nameReader = getReader("D:/index/name");
IndexReader pinyinReader = getReader("D:/index/pinyin");
IndexReader descReader = getReader("D:/index/desc");
MultiReader multiReader = new MultiReader(nameReader, pinyinReader, descReader);
IndexSearcher s = new IndexSearcher(multiReader);
Analyzer analyzer = new StandardAnalyzer(LuceneUtils.VERSION);
Analyzer ikanalyzer = new IKAnalyzer();
QueryParser queryParser = new QueryParser(LuceneUtils.VERSION, "content", analyzer);//分词器只能写一个!!
Query query = queryParser.parse(queryStr);
TopDocs topdocs = s.search(query, 10);// 查询前10条
show(s, topdocs, "id", "content");
}
Query query = MultiFieldQueryParser.parse(queries, fields, clauses, new StandardAnalyzer());
MultiFieldQueryParser.parse方法里面的分词器参数是一个对象,我希望fields中不同字段用不同的分词器进行查询。