请选择 进入手机版 | 继续访问电脑版
搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

lucene实践 - 索引维护、多域查询、高亮显示

[复制链接]
查看: 67|回复: 0

3万

主题

3万

帖子

9万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
92756
发表于 2020-2-15 16:21 | 显示全部楼层 |阅读模式
  之前的博客搜索栏用的是 sql 模糊查询举行查找,近来学完lucene,要学以致用啊,就把sql搜索给更换下来吧
  中心碰到一些题目,也是学进程中没有提到的,所以说,照旧理论出真知啊。
lucene分隔来说的话,我感受就是两大块:索引保护、搜索索引
索引保护包含:增加索引、删除索引、更新索引
  1. public class BlogIndex {// lucene 途径在 bean 里面设备    private String lucenePath;public String getLucenePath() {        return lucenePath;    }    public void setLucenePath(String lucenePath) {        this.lucenePath = lucenePath;    }    /**     * 获得对lucene的写入方式     */    private IndexWriter getWriter() throws Exception {        Directory dir = FSDirectory.open(new File(lucenePath).toPath());        IndexWriterConfig config = new IndexWriterConfig(new IKAnalyzer());        IndexWriter indexWriter = new IndexWriter(dir,config);        return indexWriter;    }        /**     * 增加索引     */    public void addIndex(BlogCustom blog) throws Exception {        IndexWriter indexWriter = getWriter();        Document doc = new Document();                doc.add(new StringField("id",String.valueOf(blog.getId()),Field.Store.YES));        doc.add(new TextField("title",blog.getTitle(),Field.Store.YES));        doc.add(new TextField("summary",blog.getSummary(),Field.Store.YES));        doc.add(new TextField("keyWord",blog.getKeyWord(),Field.Store.YES));        indexWriter.addDocument(doc);        indexWriter.close();    }        /**     * 更新索引     */    public void updateIndex(BlogCustom blog) throws Exception {        IndexWriter indexWriter = getWriter();        Document doc = new Document();                doc.add(new StringField("id",blog.getId()+"",Field.Store.YES));        doc.add(new TextField("title",blog.getTitle(),Field.Store.YES));        doc.add(new TextField("summary",blog.getSummary(),Field.Store.YES));        doc.add(new TextField("keyWord",blog.getKeyWord(),Field.Store.YES));                indexWriter.updateDocument(new Term("id",String.valueOf(blog.getId())),doc);        indexWriter.close();    }        /**     * 删除索引     */    public void deleteIndex(String blogId) throws Exception {        IndexWriter indexWriter = getWriter();        indexWriter.deleteDocuments(new Term("id",blogId));        indexWriter.close();    }
复制代码
搜索索引就比力复杂一点
  1.     /**     * 搜索索引     */    public List searchBlog(String q) throws Exception{        //建立一个 Analyzer工具,IKAnalyzer 工具        Analyzer analyzer = new IKAnalyzer();        List blogList = new LinkedList();        Directory dir = FSDirectory.open(new File(lucenePath).toPath());        IndexReader indexReader = DirectoryReader.open(dir);        IndexSearcher indexSearch = new IndexSearcher(indexReader);                // 多域查询        String[] fields = {"id","title","summary","keyWord"};        // 表示多个条件之间的关系,SHOULD 只要一个域里面有满足我们的搜索的内容就行        // 数组长度 = fields 长度        BooleanClause.Occur[] clauses = { BooleanClause.Occur.SHOULD,BooleanClause.Occur.SHOULD,                BooleanClause.Occur.SHOULD,BooleanClause.Occur.SHOULD };        // 参数: 关键词、多域、条件之间的关系、中文分析器        Query query = MultiFieldQueryParser.parse(q, fields, clauses, analyzer);        // 查询结果,设备最多返回100条数据        TopDocs topDocs = indexSearch.search(query, 100);                // 高亮关键词        // 高亮格式        SimpleHTMLFormatter formatter = new SimpleHTMLFormatter("[color=red]","[/color]");        // 关键词查询出来的指定位置        QueryScorer scorer = new QueryScorer(query);        // 在关键词指定位置,加上设定的高亮格式        Highlighter highlighter = new Highlighter(formatter,scorer);        // 设备含有关键字文本块的巨细        highlighter.setTextFragmenter(new SimpleSpanFragmenter(scorer));                ScoreDoc[] scoreDocs = topDocs.scoreDocs;        //遍历查询结果,放入blogList        for(ScoreDoc scoreDoc : scoreDocs){            // 取当前文档            Document doc = indexSearch.doc(scoreDoc.doc);            BlogCustom blog = new BlogCustom();                        // 取出关键词            int id = Integer.parseInt(doc.get("id"));            blog.setId(id);            String title = doc.get("title");            String summary = doc.get("summary");            String keyWord = doc.get("keyWord");                        // 给不为空的关键词,加上高亮表示            if(title!=null) {                TokenStream tokenStream = analyzer.tokenStream("title", title);                String hTitle = highlighter.getBestFragment(tokenStream, title);                if(StringUtil.isEmpty(hTitle)) {                    blog.setTitle(title);                }else {                    blog.setTitle(hTitle);                }            }            if(summary!=null) {                TokenStream tokenStream = analyzer.tokenStream("summary", summary);                String hSummary = highlighter.getBestFragment(tokenStream, summary);                if(StringUtil.isEmpty(hSummary)) {                    blog.setSummary(summary);                }else {                    blog.setSummary(hSummary);                }            }            if(keyWord!=null) {                TokenStream tokenStream = analyzer.tokenStream("keyWord", keyWord);                String hKeyWord = highlighter.getBestFragment(tokenStream, keyWord);                if(StringUtil.isEmpty(hKeyWord)) {                    blog.setKeyWord(keyWord);                }else {                    blog.setKeyWord(hKeyWord);                }            }            blogList.add(blog);        }        return blogList;    }    }
复制代码

完成 !

免责声明:假如加害了您的权益,请联系站长,我们会实时删除侵权内容,感谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 WAYSFOCUS 影像 你 我 他,中国商业影视一站式解决平台 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表