第六步:Lucene查询索引
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 | package cn.harmel.lucene; import java.io.IOException; import java.nio.file.Paths; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.IndexReader; import org.apache.lucene.queryparser.classic.ParseException; import org.apache.lucene.queryparser.classic.QueryParser; import org.apache.lucene.queryparser.classic.QueryParser.Operator; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.Sort; import org.apache.lucene.search.SortField; import org.apache.lucene.search.SortField.Type; import org.apache.lucene.search.TopDocs; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; public class SearchIndex { public static void main(String[] args) throws IOException, ParseException { /*--------------------------------------------------------------------------------- * String queryString="title:\"美国\"";//包含“美国” * String queryString="NOT title:\"美国\" AND title:\"国\"";//不包含 “美国” 但是包含 “国” * String queryString="title:\"中\" AND title:\"国人\"";//即包含 “中” 又包含 ”国人“ * String queryString="title:\"张三\" OR title:\"李四\"";//包含 “张三” 或 ”李四“ * String queryString="id:[1 TO 5]";//查询 1<=id<=5 * String queryString="id:{1 TO 5}";//查询 1<id<5 * String queryString="title:\"中国\" AND NOT title:\"张三\" AND id:[1 TO 5]"; * String queryString="title:(中国 张三)";即包含 “中国” 又包含 ”张三“ ---------------------------------------------------------------------------------*/ String queryString= "title:\"中国\"" ; Analyzer analyzer = new StandardAnalyzer(); //StandardAnalyzer:汉字一个一个字拆分索引 Directory dir = FSDirectory.open(Paths.get( "E:\\LuceneIndex" )); //获取索引存储的位置 IndexReader reader = DirectoryReader.open(dir); IndexSearcher is = new IndexSearcher(reader); QueryParser parser= new QueryParser( "" , analyzer); parser.setDefaultOperator(Operator.AND); //默认状态下,空格被认为是OR的关系,设置为空格为AND Query query = parser.parse(queryString); //排序 Sort sort = new Sort( new SortField( "dt" , Type.LONG, true )); TopDocs topDocs = is.search(query, 20 ,sort); System.out.println( "总共匹配多少个:" + topDocs.totalHits); //获取查询结果集 ScoreDoc[] hits = topDocs.scoreDocs; //遍历结果集 for (ScoreDoc scoreDoc : hits) { //System.out.println("匹配得分:" + scoreDoc.score); //System.out.println("文档索引ID:" + scoreDoc.doc); Document document = is.doc(scoreDoc.doc); System.out.println(document.get( "id" )+ "-" +document.get( "name" )+ "-" +document.get( "dt" )+ "-" +document.get( "title" )); } reader.close(); dir.close(); } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构