利用IKAnalyzer分词和索引维护
Posted 1314justin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用IKAnalyzer分词和索引维护相关的知识,希望对你有一定的参考价值。
1.默认标准分析器 所有分析器最终继承的类都是Analyzer
1.1 编写AnalyzerTest类
//默认标准分析器 //1.创建一个Analyzer对象 Analyzer analyzer=new StandardAnalyzer(); //2.调用Analyzer对象的tokenStream方法获取TokenStream对象,此对象包含了所有分词结果 TokenStream tokenStream=analyzer.tokenStream("","spring springmvc mysql 数据库 freamework mybatis 呵呵"); //3.给tokenStyream对象设置一个指针,只恨在哪当前就在哪一个分词上 CharTermAttribute charTermAttribute=tokenStream.addAttribute(CharTermAttribute.class); //4.调用tokenStream对象的reset方法,充值指针,不调用会报错 tokenStream.reset(); //5.利用while循环,拿到分词列表的结果 incrementToken方法返回值如果为false代表读取完毕 true代表没有读取完毕 while (tokenStream.incrementToken()){ System.out.println(charTermAttribute.toString()); } //6.关闭 tokenStream.close(); }
1.2 查看分词效果 如图可见所有数据都被分词了但是中文数据分成了一个字一个字的 所以我们可使用IKAnalyzer进行分词
1.3 使用IKAnalyzer进行分词
//使用IKAnalyzer分词 Analyzer analyzer=new IKAnalyzer(); //2.调用Analyzer对象的tokenStream方法获取TokenStream对象,此对象包含了所有分词结果 TokenStream tokenStream=analyzer.tokenStream("","spring springmvc mysql 数据库 freamework mybatis 呵呵"); //3.给tokenStyream对象设置一个指针,只恨在哪当前就在哪一个分词上 CharTermAttribute charTermAttribute=tokenStream.addAttribute(CharTermAttribute.class); //4.调用tokenStream对象的reset方法,充值指针,不调用会报错 tokenStream.reset(); //5.利用while循环,拿到分词列表的结果 incrementToken方法返回值如果为false代表读取完毕 true代表没有读取完毕 while (tokenStream.incrementToken()){ System.out.println(charTermAttribute.toString()); } //6.关闭 tokenStream.close(); }
1.4 查看分词效果 与上图比对自行体会
2.索引维护:添加、删除、修改
2.1 添加索引
//添加索引 @Test public void createDocument() throws IOException { //1.创建IndexWriter对象 参数一:索引库位置 参数二: 指定配置 IndexWriter indexWriter=new IndexWriter(FSDirectory.open(new File("C:UsersAdministratorDesktopindex").toPath()), new IndexWriterConfig(new IKAnalyzer())); //创建一个文档对象 Document document=new Document(); document.add(new TextField("fieldName","haha.text", Field.Store.YES)); document.add(new StoredField("fieldPath","G://haha.text")); document.add(new LongPoint("fieldSize",123)); document.add(new StoredField("fieldSize",123)); document.add(new TextField("fieldName","ojdbc14和ikanalyzer的maven找不到的解决办法,手动发布oJdbc14到maven仓库,手动发布ikanalyzer到maven,同时本教程适用于所有jar包发布 下载 IKAnalyzer结合Lucene使用和单独使用例子 简单性能测试 11-26 阅读数 1890 IKAnalyzer是一个开源基于JAVA语言的 ",Field.Store.YES)); //创建索引,将文档添加到索引库当中 indexWriter.addDocument(document); //关闭 indexWriter.close(); }
2.2 查看效果索引库中已有15个文档所以执行后又16个
2.3 删除所有索引
//删除所有索引 @Test public void delDocument() throws IOException { //1.创建IndexWriter对象 参数一:索引库位置 参数二: 指定配置 IndexWriter indexWriter=new IndexWriter(FSDirectory.open(new File("C:UsersAdministratorDesktopindex").toPath()), new IndexWriterConfig(new IKAnalyzer())); //删除索引 indexWriter.deleteAll(); //关闭 indexWriter.close(); }
2.4 查看效果 当前已无索引
2.5 根据域和关键词删除索引 删除前先把索引文档恢复成15个文档
@Test public void delDocumentByTerm() throws IOException { //1.创建IndexWriter对象 参数一:索引库位置 参数二: 指定配置 IndexWriter indexWriter=new IndexWriter(FSDirectory.open(new File("C:UsersAdministratorDesktopindex").toPath()), new IndexWriterConfig(new IKAnalyzer())); //定义一个删除条件,定义一个查询对象 Query query=new TermQuery(new Term("fieldName","全文检索")); //删除索引 indexWriter.deleteDocuments(query); //关闭 indexWriter.close(); }
2.6 首先我们删除前查看带有全文检索的文档名称又几个 我么查询到带有全文检索的文档名称又两个
2.7 执行删除 查询效果 现在文档数变为13
2.8 修改索引 修改首先将匹配到的文档删除后再添加一个
//修改索引,修改fieldName域中关键词匹配到全文索引的文档 @Test public void updaDocument() throws IOException { //1.创建IndexWriter对象 参数一:索引库位置 参数二: 指定配置 IndexWriter indexWriter=new IndexWriter(FSDirectory.open(new File("C:UsersAdministratorDesktopindex").toPath()), new IndexWriterConfig(new IKAnalyzer())); Document document=new Document(); document.add(new TextField("fieldName","new.txt", Field.Store.YES)); document.add(new StoredField("fieldPath","c://new.txt")); document.add(new LongPoint("fieldSize",456)); document.add(new StoredField("fieldSize",456)); document.add(new TextField("fieldContent","修改fieldName为全文检索的文档,进行文档替换,先删除掉fieldName为全文检索的两个文档,再添加一个fileName为new的新文档", Field.Store.YES)); //修改 参数一为条件 参数二为修改的文档值 indexWriter.updateDocument(new Term("fieldName","全文检索"),document); //关闭 indexWriter.close(); }
2.9 查询效果 15个文档共有2个fielName带有全文检索所将两个删除后又添加一个为14个
2.10 根据域和关键词查询
private IndexSearcher indexSearcher; private IndexReader indexReader; @Before public void getSearcher() throws IOException { //1.创建Directory对象,指定索引库位置 Directory directory= FSDirectory.open(new File("C:UsersAdministratorDesktopindex").toPath()); //2.创建IndexReader对象,读取索引库内容 indexReader= DirectoryReader.open(directory); //3.创建IndexSearcher对象 indexSearcher=new IndexSearcher(indexReader); }
//根据域和关键词进行查询 @Test public void TermQuery() throws IOException { //创建查询条件 Query query=new TermQuery(new Term("fieldName","new")); //执行查询 TopDocs topDocs=indexSearcher.search(query,10); System.out.println("返回的文档个数:"+topDocs.totalHits); //获取到文档集合 ScoreDoc[] scoreDocs=topDocs.scoreDocs; for (ScoreDoc doc:scoreDocs){ //获取到文档 Document document=indexSearcher.doc(doc.doc); //获取到文档域中数据 System.out.println("fieldName:"+document.get("fieldName")); System.out.println("fieldPath:"+document.get("fieldPath")); System.out.println("fieldSize:"+document.get("fieldSize")); System.out.println("fieldContent:"+document.get("fieldContent")); System.out.println("======================================================================"); } //关闭 indexReader.close(); }
2.11 查询效果
2.12 匹配一行数据 这行数据会自动分词
//匹配一行数据,这一行数据会自动进行分词 @Test public void QueryParser() throws IOException, ParseException { //创建一个QueryParser对象 参数一:查询的域 参数二:使用哪种分析器 QueryParser parser=new QueryParser("fieldContent",new IKAnalyzer()); //设置匹配的数据条件 Query query = parser.parse("Lucene是一个开源的基于Java的搜索库"); //查询 TopDocs topDocs = indexSearcher.search(query, 10); System.out.println("返回的文档个数:"+topDocs.totalHits); //获取到文档集合 ScoreDoc [] scoreDocs=topDocs.scoreDocs; for (ScoreDoc doc:scoreDocs) { //获取到文档 Document document = indexSearcher.doc(doc.doc); //获取到文档域中数据 System.out.println("fieldName:"+document.get("fieldName")); System.out.println("fieldPath:"+document.get("fieldPath")); System.out.println("fieldSize:"+document.get("fieldSize")); System.out.println("fieldContent:"+document.get("fieldContent")); System.out.println("=============================================================="); } //关闭 indexReader.close(); }
2.13 查询效果
//添加索引
@Test
public void createDocument() throws IOException {
//1.创建IndexWriter对象 参数一:索引库位置 参数二: 指定配置
IndexWriter indexWriter=new IndexWriter(FSDirectory.open(new File("C:UsersAdministratorDesktopindex").toPath()), new IndexWriterConfig(new IKAnalyzer()));
//创建一个文档对象
Document document=new Document();
document.add(new TextField("fieldName","haha.text", Field.Store.YES));
document.add(new StoredField("fieldPath","G://haha.text"));
document.add(new LongPoint("fieldSize",123));
document.add(new StoredField("fieldSize",123));
document.add(new TextField("fieldName","ojdbc14和ikanalyzer的maven找不到的解决办法,手动发布oJdbc14到maven仓库,手动发布ikanalyzer到maven,同时本教程适用于所有jar包发布 下载 IKAnalyzer结合Lucene使用和单独使用例子 简单性能测试 11-26 阅读数 1890 IKAnalyzer是一个开源基于JAVA语言的 ",Field.Store.YES));
//创建索引,将文档添加到索引库当中
indexWriter.addDocument(document);
//关闭
indexWriter.close();
}
以上是关于利用IKAnalyzer分词和索引维护的主要内容,如果未能解决你的问题,请参考以下文章