二、高亮显示
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
53 
54 
55 
56 
57 
58 
59 
60 
61 
62 
63 
64 
65 
66 
67 
68 
69 
70 
71 
72 
73 
74 
75 
76 
77 
78 
79 
80 
81 
82 
83 
84 
85 
86 
87 
88 
89 
90 
91 
92 
93 
94 
95 
96 
97 
98 
99 
100 
101 
102 
103 
104 
105 
106 
 | 
package com.how2java;import java.io.IOException;import java.io.StringReader;import java.util.ArrayList;import java.util.List;import org.apache.lucene.analysis.TokenStream;import org.apache.lucene.document.Document;import org.apache.lucene.document.Field;import org.apache.lucene.document.TextField;import org.apache.lucene.index.DirectoryReader;import org.apache.lucene.index.IndexReader;import org.apache.lucene.index.IndexWriter;import org.apache.lucene.index.IndexWriterConfig;import org.apache.lucene.index.IndexableField;import org.apache.lucene.queryparser.classic.QueryParser;import org.apache.lucene.search.IndexSearcher;import org.apache.lucene.search.Query;import org.apache.lucene.search.ScoreDoc;import org.apache.lucene.search.highlight.Highlighter;import org.apache.lucene.search.highlight.QueryScorer;import org.apache.lucene.search.highlight.SimpleHTMLFormatter;import org.apache.lucene.store.Directory;import org.apache.lucene.store.RAMDirectory;import org.wltea.analyzer.lucene.IKAnalyzer;public class TestLucene {    public static void main(String[] args) throws Exception {        // 1. 准备中文分词器        IKAnalyzer analyzer = new IKAnalyzer();        // 2. 索引        List<String> productNames = new ArrayList<>();        productNames.add("飞利浦led灯泡e27螺口暖白球泡灯家用照明超亮节能灯泡转色温灯泡");        productNames.add("飞利浦led灯泡e14螺口蜡烛灯泡3W尖泡拉尾节能灯泡暖黄光源Lamp");        productNames.add("雷士照明 LED灯泡 e27大螺口节能灯3W球泡灯 Lamp led节能灯泡");        productNames.add("飞利浦 led灯泡 e27螺口家用3w暖白球泡灯节能灯5W灯泡LED单灯7w");        productNames.add("飞利浦led小球泡e14螺口4.5w透明款led节能灯泡照明光源lamp单灯");        productNames.add("飞利浦蒲公英护眼台灯工作学习阅读节能灯具30508带光源");        productNames.add("欧普照明led灯泡蜡烛节能灯泡e14螺口球泡灯超亮照明单灯光源");        productNames.add("欧普照明led灯泡节能灯泡超亮光源e14e27螺旋螺口小球泡暖黄家用");        productNames.add("聚欧普照明led灯泡节能灯泡e27螺口球泡家用led照明单灯超亮光源");            Directory index = createIndex(analyzer, productNames);        // 3. 查询器        String keyword = "护眼带光源";        Query query = new QueryParser("name", analyzer).parse(keyword);                 // 4. 搜索        IndexReader reader = DirectoryReader.open(index);        IndexSearcher searcher = new IndexSearcher(reader);        int numberPerPage = 1000;        System.out.printf("当前一共有%d条数据%n",productNames.size());        System.out.printf("查询关键字是:\"%s\"%n",keyword);        ScoreDoc[] hits = searcher.search(query, numberPerPage).scoreDocs;        // 5. 显示查询结果        showSearchResults(searcher, hits, query, analyzer);        // 6. 关闭查询        reader.close();    }    private static void showSearchResults(IndexSearcher searcher, ScoreDoc[] hits, Query query, IKAnalyzer analyzer)            throws Exception {        System.out.println("找到 " + hits.length + " 个命中.");        System.out.println("序号\t匹配度得分\t结果");         //高亮展示 
        SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<span style='color:red'>", "</span>");        Highlighter highlighter = new Highlighter(simpleHTMLFormatter, new QueryScorer(query));        for (int i = 0; i < hits.length; ++i) {            ScoreDoc scoreDoc= hits[i];            int docId = scoreDoc.doc;            Document d = searcher.doc(docId);            List<IndexableField> fields = d.getFields();            System.out.print((i + 1));            System.out.print("\t" + scoreDoc.score);            for (IndexableField f : fields) {                //高亮展示 
                TokenStream tokenStream = analyzer.tokenStream(f.name(), new StringReader(d.get(f.name())));                String fieldContent = highlighter.getBestFragment(tokenStream, d.get(f.name()));                               System.out.print("\t" + fieldContent);            }            System.out.println("<br>");        }    }    private static Directory createIndex(IKAnalyzer analyzer, List<String> products) throws IOException {        Directory index = new RAMDirectory();        IndexWriterConfig config = new IndexWriterConfig(analyzer);        IndexWriter writer = new IndexWriter(index, config);        for (String name : products) {            addDoc(writer, name);        }        writer.close();        return index;    }    private static void addDoc(IndexWriter w, String name) throws IOException {        Document doc = new Document();        doc.add(new TextField("name", name, Field.Store.YES));        w.addDocument(doc);    }} | 
运行结果
运行结果是html代码,为了正常显示,复制到一个html文件里,打开就可以看到效果了
                    
                
                
            
        
浙公网安备 33010602011771号