3.3.5 测试代码
private ArticleDao articleDao=new ArticleDao();
@Test
public void testIndexWriter() throws IOException{
Article article=new Article(1, \青岛\, \小磊\, \青岛八大关秋天
最美,最喜欢枫叶maple\, \); articleDao.addIndex(article);
}
3.4 查询(R)操作 3.4.1 查询代码
//查询 public List queryIndex(String keyword) throws Exception{
IndexSearcher indexSearcher=LuceneUtil.getIndexSearcher(); String[] fields={\,\}; //这里用了新的查询方式
QueryParser queryParser=new
MultiFieldQueryParser(LuceneUtil.getMatchVersion(), fields, LuceneUtil.getAnalyzer());
}
//根据keyword来检索数据
Query query=queryParser.parse(keyword);
TopDocs topDocs=indexSearcher.search(query, 100);
System.out.println(\检索出符合的数据一共有\+topDocs.totalHits); ScoreDoc[] scoreDocs=topDocs.scoreDocs;
List articles=new ArrayList(); for(ScoreDoc scoreDoc:scoreDocs){ }
return articles;
int docID=scoreDoc.doc;
Document document=indexSearcher.doc(docID);
Article article=ArticleUtil.documentToArticle(document); articles.add(article);
3.4.2 测试代码
@Test
public void testQueryIndex() throws Exception{
}
List articles=articleDao.queryIndex(\八大关\); for(Article article:articles){ }
System.out.println(article);
3.4.3 测试结果
3.5 查询+分页操作 3.5.1 分页代码
3.5.2 测试代码
@Test
public void testQueryPageIndex() throws Exception{ }
List articles=articleDao.queryIndex(\八大关\,20,10); for(Article article:articles){ }
System.out.println(article);
3.5.3 测试结果
3.6 删除操作 3.6.1 删除代码
public void delIndex(String fileName,String fileValue) throws IOException{
IndexWriter indexWriter=LuceneUtil.getIndexWriter();
Term term=new Term(fileName, fileValue);//Term方式查找,单个单个词
查找方式 indexWriter.deleteDocuments(term);
}
indexWriter.close();
3.6.2 测试代码
@Test
public void testDel() throws IOException{ articleDao.delIndex(\, \小磊\); }
再次查询发现索引库中所有数据都被删除。
3.7 更新操作 3.7.1 更新代码
public void updateIndex(String fileName,String fileValue,Article article) throws IOException{
IndexWriter indexWriter=LuceneUtil.getIndexWriter();
Term term=new Term(fileName, fileValue);
Document doc=ArticleUtil.articleToDocument(article);
indexWriter.updateDocument(term, doc);
}
indexWriter.close();
3.7.2 测试代码
@Test
public void testUpdate() throws IOException{
Article article=new Article(1587, \大更新\, \临沂\, \大美临沂\, \);
articleDao.updateIndex(\, \大\, article); }
更新的这条刚开始索引库中是没有的,再次查询发现索引库中有了刚刚更新的这条数据。得知
索引文件的检索与维护,更新是先删除后创建,所以更新操作需要较高的代价。因为文档修改后(即使是很小的修改),就可能会造成文档中的很多的关键词的位置都发生了变化,这就需要频繁的读取和修改记录,这种代价是相当高的。因此,一般不进行真正的更新操作,而是使用“先删除,再创建”的方式代替更新操作。
4 分词器
4.1 分词器的作用
在创建索引时会用到分词器,在使用字符串搜索时也会用到分词器,这两个地方要使用同一个分词器,否则可能会搜索不出结果。
Analyzer(分词器)的作用是把一段文本中的词按规则取出所包含的所有词。对应的是Analyzer类,这是一个抽象类,切分词的具体规则是由子类实现的,所以对于不同的语言(规则),要用不同的分词器。如下图:
4.2 分词器的工作流程
分词器的一般工作流程:
1, 切分关键词 2, 去除停用词
3,对于英文单词,把所有字母转为小写(搜索时不区分大小写)
说明:有的分词器还对英文进行形态还原,就是去除单词词尾的形态变化,将其还原为词的原形。这样做可以搜索出更多有意义的结果。如搜索sutdent时,也可以搜索出students,这是很有用的。
4.3 停用词
有些词在文本中出现的频率非常高,但是对文本所携带的信息基本不产生影响,例如英文的“a、an、the、of”,或中文的“的、了、着、是”,以及各种标点符号等,这样的词称为停用词(stop word)。文本经过分词之后,停用词通常被过滤掉,不会被进行索引。在检索的时候,用户的查询中如果含有停用词,检索系统也会将其过滤掉(因为用户输入的查询字符串也要进行分词处理)。排除停用词可以加快建立索引的速度,减小索引库文件的大小。
4.4 常用的中文分词器
中文的分词比较复杂,因为不是一个字就是一个词,而且一个词在另外一个地方就可能不是一个词,如在“帽子和服装”中,“和服”就不是一个词。对于中文分词,通常有三种方式:单字分词、二分法分词、词典分词。
4.4.1 单字分词
就是按照中文一个字一个字地进行分词。如:“我们是中国人”
效果:“我”、“们”、“是”、“中”、“国”、“人”。(StandardAnalyzer就是这样)。英文按照空格来分。
4.4.2 二分法分词
按两个字进行切分。如:“我们是中国人”,效果:“我们”、“们是”、“是中”、“中国”、“国人”。(CJKAnalyzer就是这样)。英文按照空格来分。
4.4.3 词典分词
按某种算法构造词,然后去匹配已建好的词库集合,如果匹配到就切分出来成为词语。通常