/** **************建立索引************************** */ // 索引文件目录
// Directory indexDir = new SimpleFSDirectory(new File("D:" + File.separator + "testindex"));
Directory indexDir = new RAMDirectory();
System.out.println("当前lucene的版本号是---" + Version.LUCENE_45);
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_45);
// 写索引的配置
IndexWriterConfig writerConfig = new IndexWriterConfig(Version.LUCENE_45, analyzer);
// 每一次都会进行创建新的索引,第二次删掉原来的创建新的索引
writerConfig.setOpenMode(OpenMode.CREATE_OR_APPEND);
IndexWriter indexWriter = new IndexWriter(indexDir, writerConfig);
Document document = new Document();
Field stringField = new TextField("int1", "hello lucky boy", Store.YES);
Reader reader = new StringReader("hello lucky boy");
/** ****************创建索引时查看分词的结果************* ****** */
TokenStream tokenStream = analyzer.tokenStream("", reader);
tokenStream.reset();
CharTermAttribute charTermAttr = tokenStream.getAttribute(CharTermAttribute.class);
System.out.println("tokenStream......" + tokenStream);
System.out.print("....分词开始....");
while (tokenStream.incrementToken())
{
System.out.print(charTermAttr + "----");
}
System.out.print("....分词结束....");
document.add(stringField);
indexWriter.addDocument(document);
indexWriter.close();
/*******查询term********/
IndexReader indexReader = DirectoryReader.open(indexDir);
IndexSearcher searcher = new IndexSearcher(indexReader);
TopDocs docs = searcher.search(new TermQuery(new Term("int1", "boy")), 10);
ScoreDoc[] hits = docs.scoreDocs;
System.out.println("......");
if(null != hits)
{
System.out.println("...存在查询的结果..."+hits.length);
for(ScoreDoc hit : hits)
{
System.out.println("命中的结果是......"+hit);
Document doc = searcher.doc(hit.doc);
System.out.println("查询出来的field是......"+doc.get("int1"));
}
}
/** *********更新索引文件document********* */
System.out.println("...更新索引文件开始...");
Term term = new Term("int1", "lucky");
IndexWriterConfig writerConfig2 = new IndexWriterConfig(Version.LUCENE_45, analyzer);
IndexWriter indexWriter2 = new IndexWriter(indexDir, writerConfig2);
// indexWriter2.updateDocument(term, document);
indexWriter2.deleteDocuments(term);
indexWriter2.close();
System.out.println("......" + document);
System.out.println("...跟新索引文件结束...");
/** **********跟新索引文件结束**** */
/**********update/delete之后的操作*********/
IndexReader indexReaderUpdate = DirectoryReader.open(indexDir);
IndexSearcher searcherUpdate = new IndexSearcher(indexReader);
TopDocs docsUpdate = searcher.search(new TermQuery(new Term("int1", "hello")), 10);
ScoreDoc[] hitsUpdate = docsUpdate.scoreDocs;
System.out.println("...跟新之后的Search操作...");
if(null != hitsUpdate)
{
System.out.println("...跟新之后存在查询的结果...");
for(ScoreDoc hit : hitsUpdate)
{
System.out.println("命中的结果是......"+hit);
Document doc = searcher.doc(hit.doc);
System.out.println("查询出来的field是......"+doc.get("int1"));
}
}
我想删除docuemnt,但是deleteDocuments方法不起作用。文档仍然相同。有什么问题吗?
答案 0 :(得分:0)
您已经打开了一个新的IndexReader
来执行第二次搜索,这很好,但您将旧读者传递给搜索者。在运行搜索时,您还使用了旧搜索器而不是新搜索器。
所以,这个:
IndexReader indexReaderUpdate = DirectoryReader.open(indexDir);
// Use indexReaderUpdate here, instead of indexReader
IndexSearcher searcherUpdate = new IndexSearcher(indexReader);
// Use searcherUpdate here, instead of searcher
TopDocs docsUpdate = searcher.search(new TermQuery(new Term("int1", "hello")), 10);
应该是:
IndexReader indexReaderUpdate = DirectoryReader.open(indexDir);
IndexSearcher searcherUpdate = new IndexSearcher(indexReaderUpdate);
TopDocs docsUpdate = searcherUpdate.search(new TermQuery(new Term("int1", "hello")), 10);
答案 1 :(得分:-1)
public final void removeReaderClosedListener(IndexReader.ReaderClosedListener listener)