java——lucene实现全文检索(五)索引的删除与查询结果高亮

/**
 * 删除指定索引库中 指定域(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));// 将权重高的摘要显示出来,得到的是关键字内容
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值