一.创建索引

 @Test
public void indexCreate() throws IOException {
//创建分词器
Analyzer analyzer = new StandardAnalyzer();
IndexWriterConfig config = new IndexWriterConfig(analyzer); //指定索引存放目录以及配置参数
Directory directory =FSDirectory.open(Paths.get("F:/luceneIndex"));
IndexWriter writer = new IndexWriter(directory,config); //采集数据
List<Book> bookList = bookDao.findAll();
/*for (Book book : bookList) {
System.out.println(book.getName());
}*/
//将采集的数据封装到Document中
Document doc = null;
for (Book book : bookList) {
doc = new Document();
// store:如果是yes,则说明存储到文档域中
//id:不分词,索引,存储
Field id = new StringField("id",book.getId().toString(),Store.YES); //name:分词,索引,存储
Field name = new TextField("name",book.getName(),Store.YES);
//price:不分词,索引,存储,
Field price = new FloatPoint("price",book.getPrice()); //pic:不分词,不索引,存储,存储要添加一个同名的StoredField
Field pic = new StoredField("pic",book.getPic());
//desciption:分词,索引,不存储
Field description = new TextField("description",book.getDescription(),Store.NO);
doc.add(id);
doc.add(name);
doc.add(price);
doc.add(new StoredField("price",book.getPrice()));//存储
doc.add(new NumericDocValuesField("price",book.getPrice().longValue()));//排序
doc.add(pic);
doc.add(description); //生成索引
writer.addDocument(doc);
} //关闭
writer.close();
}

注意:创建索引时,对应price采用了FloatPoint,如果要对此字段进行存储,要添加同名的StoredField,如果要对此字段进行排序,要添加同名的NumericDocValuesField,

否则会报unexpected docvalues type异常

二.排序

 //查询
@Test
public void indexSearch() throws IOException, ParseException {
String[] fields = {"name","description"};
MultiFieldQueryParser parser = new MultiFieldQueryParser(fields,new StandardAnalyzer());
Query query = parser.parse("lucene");
query = parser.parse("java");
doSearch(query);
} private void doSearch (Query query) {
Directory directory;
try {
directory = FSDirectory.open(Paths.get("F:/luceneIndex")); IndexReader reader = DirectoryReader.open(directory);
//创建IndexSearcher
IndexSearcher searcher = new IndexSearcher(reader);
//true表示降序
//SortField.Type.SCORE 根据相关度进行排序(默认)
//SortField.Type.DOC 根据文档编号或者说是索引顺序
//SortField.Type.FLOAT(Long等),根据fieldName的数值类型进行排序
SortField sortField = new SortField("price",SortField.Type.FLOAT,true);
Sort sort = new Sort(sortField);
TopDocs topDocs = searcher.search(query,10,sort);
long count = topDocs.totalHits;
System.out.println("匹配的总条数是----" + count); //根据相关度排序后的结果
ScoreDoc[] docs = topDocs.scoreDocs;
for (ScoreDoc scoreDoc : docs) {
int docId = scoreDoc.doc;
Document document = searcher.doc(docId);
System.out.println("id----"+document.get("id"));
System.out.println("name----"+document.get("name"));
System.out.println("price----"+document.get("price"));
/*System.out.println("pic----"+document.get("pic"));
System.out.println("description----"+document.get("description"));*/
System.out.println("======================");
}
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }

此外还有

//Sort.RELEVANCE 根据相关度排序
//Sort.INDEXORDER 根据索引顺序排序
TopDocs topDocs = searcher.search(query,10,Sort.INDEXORDER);

最新文章

  1. JDBC基础与连接sql2012
  2. bzoj3732: Network--kruskal最小生成树+LCA
  3. css中的position:relative和absolute 属性
  4. With as 递归查询
  5. [老老实实学WCF] 第七篇 会话
  6. runnable和thread的区别
  7. unix网络编程之简介
  8. DNA Sorting--hdu1379
  9. CentOS上部署Apache、MySQL和PHP
  10. 清除number输入框的上下箭头
  11. Python设计模式 - UML - 时序图(Sequence Diagram)
  12. kafka+elk
  13. git 冲突解决办法
  14. java 线程Thread 技术--1.5 Executor Executors,ThreadPool,Queue
  15. 解释JS变量作用域的范例
  16. 迭代删除元素 并发bug 低级错误
  17. Python简介及编码
  18. 搭建SpringBoot服务器,在公司内网中使用
  19. 深入浅出 Java Concurrency (11): 锁机制 part 6 CyclicBarrier
  20. Linux 静态和动态添加路由

热门文章

  1. Haproxy 为 mysql 做负载均衡
  2. cpu信息
  3. 每日技术总结:Toast组件,eslint,white-space,animate,$emit
  4. POJ 2752 Seek the Name, Seek the Fame (KMP)
  5. php BC高准确度函数库
  6. centos中的配置文件 分类: B3_LINUX 2015-04-03 22:21 184人阅读 评论(0) 收藏
  7. 结合Wireshark捕获分组深入理解TCP/IP协议之以太网帧
  8. outlook vba 2
  9. 【33.20%】【LA 4320】【Ping pong】
  10. Notepad++打开xml文件显示crlf的问题