/** * 删除指定索引库中 指定域(fieldName) 包含指定字符串(text) 的索引 * 如 fieldName 等于 fileName,text 为 "solr" 时,表示删除文件名包含"solr"字符串的索引及其文档 * @param fieldName :文档域名,必须与创建索引时使用的域名一致 * @param text :根据关键字删除 * @param indexDir */ public static void indexDelByTerm(File indexDir, String fieldName, String text) throws IOException, ParseException { if (indexDir == null || !indexDir.exists() || indexDir.isFile()) { return; } if (fieldName == null || "".equals(fieldName) || text == null) { return; } Analyzer analyzer = new IKAnalyzer(); Directory directory = FSDirectory.open(indexDir.toPath()); IndexWriterConfig config = new IndexWriterConfig(analyzer); IndexWriter indexWriter = new IndexWriter(directory, config); Term term = new Term(fieldName, text); System.out.println(term); indexWriter.deleteDocuments(term); indexWriter.commit(); indexWriter.close(); } /** * 删除指定索引库中 指定域(fieldName) 包含指定字符串(text) 的索引 * 如 fieldName 等于 fileName,text 为 "solr" 时,表示删除文件名包含"solr"字符串的索引及其文档 * * @param fieldName :文档域名,必须与创建索引时使用的域名一致 * @param text :根据关键字删除 * @param indexDir :索引库 */ public static void indexDelByQuery(File indexDir, String fieldName, String text) throws IOException, ParseException { if (indexDir == null || !indexDir.exists() || indexDir.isFile()) { return; } if (fieldName == null || "".equals(fieldName) || text == null) { return; } Analyzer analyzer = new StandardAnalyzer(); Directory directory = FSDirectory.open(indexDir.toPath()); IndexWriterConfig config = new IndexWriterConfig(analyzer); IndexWriter indexWriter = new IndexWriter(directory, config); QueryParser queryParser = new QueryParser(fieldName, analyzer); Query query = queryParser.parse(text); System.out.println(query); indexWriter.deleteDocuments(query); /** 虽然不 commit,也会生效,但建议做提交操作,*/ indexWriter.commit(); /** 关闭流,里面会自动 flush*/ indexWriter.close(); }
删除需根据唯一标识进行删除
注意根据唯一标识删除时 要保证该字段生成索引时没有分词 否则会导致删除索引无效
高亮:
QueryScorer scorer = new QueryScorer(phraseQuery);// 查询得分 // Fragmenter fragmenter = new SimpleSpanFragmenter(scorer);// 得到得分的片段,就是得到一段包含所查询的关键字的摘要 Fragmenter fragmenter = new SimpleFragmenter(40); // 设置结果字数 SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter( "<b><font color='red'>", "</font></b>");// 对查询的数据格式化;无参构造器的默认是将关键字加粗 Highlighter highlighter = new Highlighter(simpleHTMLFormatter, scorer);// 根据得分和格式化 highlighter.setTextFragmenter(fragmenter);// 设置成高亮
// 结果总数topDocs.totalHits for (ScoreDoc sdoc : topDocs.scoreDocs) { // 根据文档id取存储的文档 Document hitDoc = indexSearcher.doc(sdoc.doc); // 取文档的字段 System.out.println(hitDoc.get("filename")); System.out.println(hitDoc.get("filepath")); String desc = hitDoc.get("contents"); if (desc != null) { Analyzer ik = new StandardAnalyzer(); TokenStream tokenStream = ik.tokenStream("desc", new StringReader(desc));// TokenStream将查询出来的搞成片段,得到的是整个内容 System.out.println(highlighter.getBestFragment(tokenStream, desc));// 将权重高的摘要显示出来,得到的是关键字内容 } }