lucene全文检索精华(3)

2019-08-31 12:51

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 词典分词

按某种算法构造词,然后去匹配已建好的词库集合,如果匹配到就切分出来成为词语。通常


lucene全文检索精华(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:帮助孩子正确面对挫折与失败

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: