lucene6.6.0学习心得
来源:互联网 发布:c语言二级考试真题 编辑:程序博客网 时间:2024/06/05 03:54
lucene是什么?
官方网站:使用Java语言编写的高性能全文检索工程。适合任何需要全文检索的应用,特别是跨平台的。
本菜鸟:空间换速度,查的快,毫秒级查询,秒杀like!
导入依赖
<dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-core</artifactId> <version>6.6.0</version></dependency><dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-analyzers-common</artifactId> <version>6.6.0</version></dependency><dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-analyzers-smartcn</artifactId> <version>6.6.0</version></dependency><dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-queryparser</artifactId> <version>6.6.0</version></dependency><dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-highlighter</artifactId> <version>6.6.0</version></dependency><dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-memory</artifactId> <version>6.6.0</version></dependency>
创建索引
lucene将需要进行检索的内容经过指定的分词器(Analyzer)分词后存为索引(一般存在文件系统FSDirectory,也可以是内存RAMDirectory)。
String indexPath = "D:/index"; //得到索引存放目录对象Directory dir = FSDirectory.open(Paths.get(indexPath, new String[0]));//这个是官方的中文分词器,还有其他MMAnalyzer、IkAnalyzer等SmartChineseAnalyzer analyzer = new SmartChineseAnalyzer();//索引写入类需要的配置类IndexWriterConfig iwc = new IndexWriterConfig(analyzer);//索引写入类IndexWriter iw = new IndexWriter(dir, iwc);//User:{Integer id,String name,String sign}List<User> userList = new ArrayList<User>();userList.add(new User(1,"老大","我是我们家的大哥大!"));userList.add(new User(2,"老二","我是呆萌的二哈!"));userList.add(new User(3,"老三","我是专门拆散家庭人人讨厌的小三!"));userList.add(new User(4,"老四","我是小可爱!"));for(User user : userList){ //document类似数据库的table Document doc = new Document(); //Field类似数据库的column doc.add(new StoredField("id",user.getId())); doc.add(new StringField("name",user.getName(),Field.store.YES)); doc.add(new TextField("sign",user.getSign(),Field.store.YES)); iw.addDocument(doc);}//创建索引完成,关闭索引写入类iw.close();
各种Field类
查询索引
lucene读取索引,根据指定的Query,或者BooleanQuery(多条件)等查询出结果根据得分情况排序。
//创建索引读取对象IndexReader reader = DirectoryReader.open(FSDirectory.open(Paths.get(luceneIndexPath, new String[0])));//创建索引查找对象IndexSearcher searcher = new IndexSearcher(reader);//创建基础查询单元Term term = new Term("sign","萌");//创建查询TermQuery query = new TermQuery(term);//查询 第二个参数代表查询得分高的前3个TopDocs search = searcher.search(query, 3);//得到命中ScoreDoc[] hits = search.scoreDocs;if(hits.length > 0){ for(ScoreDoc sd : hits){ Document doc = searcher.doc(sd.doc); System.out.println("id:"+ doc.get("id") +",name:"+ doc.get("name") +",sign:"+ doc.get("sign")); }}
多条件查询
//创建官方中文分词器SmartChineseAnalyzer analyzer = new SmartChineseAnalyzer();//创建一个查询解析器QueryParser parser = new QueryParser("sign", analyzer);//解析传入的查询内容 例如我家 -> sign:我,sign:家,如果只是TermQuery则不进行分析解析sign:我家Query query = parser.parse("我家");//创建BooleanClauseBooleanClause c1 = new BooleanClause(new TermQuery(new Term("name", "大")), Occur.SHOULD);BooleanClause c2 = new BooleanClause(query, Occur.SHOULD);//添加查询条件到查询器中BooleanQuery booleanQuery = new BooleanQuery.Builder().add(c1).add(c2).build();TopDocs search = searcher.search(booleanQuery, 3);
Occur类说明
排序
如果需要排序,则在创建索引的时候如下设置
//存入索引,但是并未存入值doc.add(new IntPoint("sort", 1));//添加排序doc.add(new NumericDocValuesField("sort", 1));//只存储值,不然结果集无法出现doc.add(new StoredField("sort", 1));
查询时则
//排序的字段为sort,类型为int,false == asc,true == descSortField sortField = new SortField("sort", SortField.Type.INT, false);Sort sort = new Sort(sortField);TopDocs results = searcher.search(query, 3, sort);
高亮显示
//创建一个高亮类,传入的SimpleHTMLFormatter默认为给匹配处添加<B></B>标签,query就是searcher.search(query, 3)中的同一个query//另一个构造器Highlighter("<i>","<i/>");Highlighter highlighter = new Highlighter(new SimpleHTMLFormatter(),new QueryScorer(query));//设置最多返回多少匹配片段highlighter.setTextFragmenter(new SimpleFragmenter(20));//得到高亮的串String sign = highlighter.getBestFragment(analyzer, "sign", doc.get("sign"));
以上是本小菜的学习总结,若有错误,请大佬指教!
阅读全文
0 0
- lucene6.6.0学习心得
- 初识Lucene6.6.0
- lucene6 IntPoint
- Lucene6.1学习案例
- lucene6.3 简单例子
- Lucene6的使用
- Lucene6.0基础教学
- Lucene6.1查询所有数据
- lucene6.2.1测试用例
- Lucene6.10教程(二) 搜索
- Lucene6.6多查询优化
- VC++6.0学习心得一
- 学习心得
- 学习心得
- 学习心得
- 学习心得
- 学习心得
- 学习心得
- 【转】文本格式导入物料凭证模板
- 正则表达式
- Android--SQLite
- select的onchange事件和onclick事件区别
- 微生态架构设计
- lucene6.6.0学习心得
- 解决Ajax跨域问题:Origin xx is not allowed by Access-Control-Allow-Origin
- 织梦自定义表单联动地区显示为数字的解决方法
- k:特殊的线性表—队列
- 解析Jquery取得iframe中元素的几种方法
- Android开发笔记:基本控件之Spinner用法
- PAT乙级1050. 螺旋矩阵(25)
- POJ1321 棋盘问题 —— DFS回溯
- Python模块包中__init__.py文件的作用