查看:3422|回复:0
Lucene 3.6实现单字段查询以及多字段分页查询高亮显示发表时间:2013-01-10 16:01:06

我爱java

0分享0主题0帖子

学徒一级

(初出茅庐)

001    package lucene.util;
002    
003    import org.apache.lucene.store.FSDirectory;
004    import org.apache.lucene.store.Directory;
005    import org.apache.lucene.search.*;
006    import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
007    import org.apache.lucene.search.highlight.Highlighter;
008    import org.apache.lucene.search.highlight.SimpleFragmenter;
009    import org.apache.lucene.search.highlight.QueryScorer;
010    import org.apache.lucene.queryParser.QueryParser;
011    import org.apache.lucene.queryParser.MultiFieldQueryParser;
012    import org.apache.lucene.analysis.TokenStream;
013    import org.apache.lucene.analysis.Analyzer;
014    import org.apache.lucene.analysis.KeywordAnalyzer;
015    import org.apache.lucene.document.Document;
016    import org.apache.lucene.index.IndexReader;
017    import org.apache.lucene.index.Term;
018    import org.apache.lucene.util.Version;
019    import modules.gk.Gk_infoSub;
020    
021    import java.util.ArrayList;
022    import java.io.File;
023    import java.io.StringReader;
024    import java.lang.reflect.Constructor;
025    
026    import web.util.StringUtil;
027    import web.sys.Globals;
028    import org.wltea.analyzer.lucene.IKAnalyzer;
029    //Wizzer.cn
030    public class LuceneQuery {
031        private static String indexPath;// 索引生成的目录
032        private int rowCount;// 记录数
033        private int pages;// 总页数
034        private int currentPage;// 当前页数
035        private int pageSize;   //每页记录数
036    
037        public LuceneQuery() {
038            this.indexPath = Globals.SYS_COM_CONFIG.get("sys.index.path").toString();
039        }
040    
041        public int getRowCount() {
042            return rowCount;
043        }
044    
045        public int getPages() {
046            return pages;
047        }
048    
049        public int getPageSize() {
050            return pageSize;
051        }
052    
053        public int getCurrentPage() {
054            return currentPage;
055        }
056    
057        /**
058         * 函数功能:根据字段查询索引
059         */
060        public ArrayList queryIndexTitle(String keyWord, int curpage, int pageSize) {
061            ArrayList list = new ArrayList();
062            try {
063                if (curpage <= 0) {
064                    curpage = 1;
065                }
066                if (pageSize <= 0) {
067                    pageSize = 20;
068                }
069                this.pageSize = pageSize;   //每页记录数
070                this.currentPage = curpage;   //当前页
071                int start = (curpage - 1) * pageSize;
072                Directory dir = FSDirectory.open(new File(indexPath));
073                IndexReader reader = IndexReader.open(dir);
074                IndexSearcher searcher = new IndexSearcher(reader);
075                Analyzer analyzer = new IKAnalyzer(true);
076                QueryParser queryParser = new QueryParser(Version.LUCENE_36, "title", analyzer);
077                queryParser.setDefaultOperator(QueryParser.AND_OPERATOR);
078                Query query = queryParser.parse(keyWord);
079                int hm = start + pageSize;
080                TopScoreDocCollector res = TopScoreDocCollector.create(hm, false);
081                searcher.search(query, res);
082    
083                SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<span style='color:red'>", "</span>");
084                Highlighter highlighter = new Highlighter(simpleHTMLFormatter, new QueryScorer(query));
085                this.rowCount = res.getTotalHits();
086                this.pages = (rowCount - 1) / pageSize + 1; //计算总页数
087                TopDocs tds = res.topDocs(start, pageSize);
088                ScoreDoc[] sd = tds.scoreDocs;
089                for (int i = 0; i < sd.length; i++) {
090                    Document hitDoc = reader.document(sd[i].doc);
091                    list.add(createObj(hitDoc, analyzer, highlighter));
092                }
093    
094            } catch (Exception e) {
095                e.printStackTrace();
096            }
097    
098            return list;
099    
100        }
101        /**
102         * 函数功能:根据字段查询索引
103         */
104        public ArrayList queryIndexFields(String allkeyword, String onekeyword, String nokeyword, int curpage, int pageSize) {
105            ArrayList list = new ArrayList();
106            try {
107                if (curpage <= 0) {
108                    curpage = 1;
109                }
110                if (pageSize <= 0) {
111                    pageSize = 20;
112                }
113                this.pageSize = pageSize;   //每页记录数
114                this.currentPage = curpage;   //当前页
115                int start = (curpage - 1) * pageSize;
116                Directory dir = FSDirectory.open(new File(indexPath));
117                IndexReader reader = IndexReader.open(dir);
118                IndexSearcher searcher = new IndexSearcher(reader);
119                BooleanQuery bQuery = new BooleanQuery();  //组合查询
120                if (!"".equals(allkeyword)) {//包含全部关键词
121                    KeywordAnalyzer analyzer = new KeywordAnalyzer();
122                    BooleanClause.Occur[] flags = {BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD};//AND
123                    Query query = MultiFieldQueryParser.parse(Version.LUCENE_36, allkeyword, new String[]{"title", "describes", "keywords"}, flags, analyzer);
124                    bQuery.add(query, BooleanClause.Occur.MUST);  //AND
125                }
126                if (!"".equals(onekeyword)) { //包含任意关键词
127                    Analyzer analyzer = new IKAnalyzer(true);
128                    BooleanClause.Occur[] flags = {BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD};//OR
129                    Query query = MultiFieldQueryParser.parse(Version.LUCENE_36, onekeyword, new String[]{"title", "describes", "keywords"}, flags, analyzer);
130                    bQuery.add(query, BooleanClause.Occur.MUST);  //AND
131                }
132                if (!"".equals(nokeyword)) { //排除关键词
133                    Analyzer analyzer = new IKAnalyzer(true);
134                    BooleanClause.Occur[] flags = {BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD};//NOT
135                    Query query = MultiFieldQueryParser.parse(Version.LUCENE_36, nokeyword, new String[]{"title", "describes", "keywords"}, flags, analyzer);
136                    bQuery.add(query, BooleanClause.Occur.MUST_NOT);  //AND
137    
138                }
139                int hm = start + pageSize;
140                TopScoreDocCollector res = TopScoreDocCollector.create(hm, false);
141                searcher.search(bQuery, res);
142                SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<span style='color:red'>", "</span>");
143                Highlighter highlighter = new Highlighter(simpleHTMLFormatter, new QueryScorer(bQuery));
144                this.rowCount = res.getTotalHits();
145                this.pages = (rowCount - 1) / pageSize + 1; //计算总页数
146                System.out.println("rowCount:" + rowCount);
147                TopDocs tds = res.topDocs(start, pageSize);
148                ScoreDoc[] sd = tds.scoreDocs;
149                Analyzer analyzer = new IKAnalyzer();
150                for (int i = 0; i < sd.length; i++) {
151                    Document hitDoc = reader.document(sd[i].doc);
152                    list.add(createObj(hitDoc, analyzer, highlighter));
153                }
154    
155            } catch (Exception e) {
156                e.printStackTrace();
157            }
158    
159            return list;
160    
161        }
162    
163        /**
164         * 创建返回对象(高亮)
165         */
166    
167        private synchronized static Object createObj(Document doc, Analyzer analyzer, Highlighter highlighter) {
168    
169            Gk_infoSub gk = new Gk_infoSub();
170            try {
171    
172                if (doc != null) {
173                    gk.setIndexno(StringUtil.null2String(doc.get("indexno")));
174                    gk.setPdate(StringUtil.null2String(doc.get("pdate")));
175                    String title = StringUtil.null2String(doc.get("title"));
176                    gk.setTitle(title);
177                    if (!"".equals(title)) {
178                        highlighter.setTextFragmenter(new SimpleFragmenter(title.length()));
179                        TokenStream tk = analyzer.tokenStream("title", new StringReader(title));
180                        String htext = StringUtil.null2String(highlighter.getBestFragment(tk, title));
181                        if (!"".equals(htext)) {
182                            gk.setTitle(htext);
183                        }
184                    }
185                    String keywords = StringUtil.null2String(doc.get("keywords"));
186                    gk.setKeywords(keywords);
187                    if (!"".equals(keywords)) {
188                        highlighter.setTextFragmenter(new SimpleFragmenter(keywords.length()));
189                        TokenStream tk = analyzer.tokenStream("keywords", new StringReader(keywords));
190                        String htext = StringUtil.null2String(highlighter.getBestFragment(tk, keywords));
191                        if (!"".equals(htext)) {
192                            gk.setKeywords(htext);
193                        }
194                    }
195                    String describes = StringUtil.null2String(doc.get("describes"));
196                    gk.setDescribes(describes);
197                    if (!"".equals(describes)) {
198                        highlighter.setTextFragmenter(new SimpleFragmenter(describes.length()));
199                        TokenStream tk = analyzer.tokenStream("keywords", new StringReader(describes));
200                        String htext = StringUtil.null2String(highlighter.getBestFragment(tk, describes));
201                        if (!"".equals(htext)) {
202                            gk.setDescribes(htext);
203                        }
204                    }
205    
206                }
207                return gk;
208            }
209            catch (Exception e) {
210    
211                e.printStackTrace();
212                return null;
213            }
214            finally {
215                gk = null;
216            }
217    
218        }
219    
220        private synchronized static Object createObj(Document doc) {
221    
222            Gk_infoSub gk = new Gk_infoSub();
223            try {
224    
225                if (doc != null) {
226                    gk.setIndexno(StringUtil.null2String(doc.get("indexno")));
227                    gk.setPdate(StringUtil.null2String(doc.get("pdate")));
228                    gk.setTitle(StringUtil.null2String(doc.get("title")));
229                    gk.setKeywords(StringUtil.null2String(doc.get("keywords")));
230                    gk.setDescribes(StringUtil.null2String(doc.get("describes")));
231                }
232                return gk;
233            }
234            catch (Exception e) {
235    
236                e.printStackTrace();
237                return null;
238            }
239            finally {
240                gk = null;
241            }
242    
243        }
244    }

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