在上一个文章中讲到了怎么创建一个索引到本地的磁盘,具体的目录结构如下所示:
接下来要介绍的是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();
}
`