Lucene(2)搜索

来源:互联网 发布:js filter函数 编辑:程序博客网 时间:2024/05/22 01:15

在上一个文章中讲到了怎么创建一个索引到本地的磁盘,具体的目录结构如下所示:这里写图片描述

接下来要介绍的是lucene怎么搜索:
在这里首先有一个非常重要的概念了,那就是分词!
分词有两个步骤:1.分词 2.过滤 一点都不让人感到意外的

分词:将field域中的内容一个个的分词。
过滤:将分好的词进行过滤,比如去掉标点符号、大写转小写、词的型还原(复数转单数、过去式转成现在式)、停用词过滤

停用词:单独应用没有特殊意义的词。比如的、啊、等,英文中的this is a the等等。

在这里我举一个生活中的例子:
this java is very good 我喜欢。
分词后会变成
this
java
is
very
good



注意:我在上文用的是标准分词器,中文是不能辨析成词组的,所以过内的很多大神才开发出了很多的中文分词器。理解了这个概念后我们往下。
每一个分出来的词都是一个域里的最小的单位term。
不同的域中拆分出来的相同的单词对应不同的term。
相同的域中拆分出来的相同的单词对应相同的term。

比如:name域下的java 和description域下的java是不一样的。创建时需要的对象是Indexwriter,而增删改时需要的是IndexReder对象。
上代码:`
public class IndexSearch {
private int doc;

@Test
public void indexSearch() throws Exception{
//1.创建query对象
//第一个参数是默认搜索的域,第二个参数是分词器
// 使用QueryParser时,需要指定分词器的,搜索时与索引时的要一致才行
QueryParser parser=new QueryParser(“description”, new StandardAnalyzer());
//通过querypaser创建query对象
// 这里输入的是lucene的查询语法的语句(关键字一定要大写)
Query query = parser.parse(“description:java AND lucene”);

//  2.  创建一个indexsearch  Directory directory = FSDirectory.open(new File("G:\\lucen"));  IndexReader reader=DirectoryReader.open(directory) ;  IndexSearcher indexSearcher=new IndexSearcher(reader);

// 3.通过indexsearch来搜索索引库
//第二个参数:需要显示的头几条数据
TopDocs topDocs = indexSearcher.search(query, 10);

  //根据查询条件匹配出的总数  int count=topDocs.totalHits;  //通过打分排序后的文档  ScoreDoc[] scoreDocs = topDocs.scoreDocs;  for (ScoreDoc scoreDoc : scoreDocs) {      //得到文档的id      int docId = scoreDoc.doc;      //通过文档的id得到文档对象      Document docs = indexSearcher.doc(docId);      System.out.println("id"+docs.get("id"));      System.out.println("name"+docs.get("name"));      System.out.println("price"+docs.get("price"));      System.out.println("图片"+docs.get("pic"));      System.out.println("descrtption"+docs.get("descrtption"));

System.out.println(“————————————”);

}  reader.close();

}

`