Lucene中文分词

package com.fxr.test2;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

import net.paoding.analysis.analyzer.PaodingAnalyzer;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;

public class TestFileIndex {

	/**
	 * ??????ж????????????
	 * @throws IOException
	 */
	public static void main(String[] args) throws IOException {
		String dataDir = "f:/lucenedata";
		String indexDir = "f:/ChinesLuceneIndex";
		File [] files = new File(dataDir).listFiles();
		System.out.println(files.length);
		Analyzer analyzer = new PaodingAnalyzer();
		Directory directory = FSDirectory.getDirectory(indexDir);
		IndexWriter indexWriter = new IndexWriter(directory,analyzer,true,IndexWriter.MaxFieldLength.LIMITED);
		for(int i=0;i<files.length;i++){
			StringBuffer strBuffer = new StringBuffer();
			String line = "";
			FileInputStream is = new FileInputStream(files[i].getCanonicalFile());
			BufferedReader reader = new BufferedReader(new InputStreamReader(is));
			System.out.println(files[i].getName());
			line = reader.readLine();
			while(line != null){
				strBuffer.append(line);
				strBuffer.append("\n");
				line = reader.readLine();
			}
			Document document = new Document();
			document.add(new Field("fileName",files[i].getName(),Field.Store.YES,Field.Index.ANALYZED));
			document.add(new Field("contents",strBuffer.toString(),Field.Store.YES,Field.Index.ANALYZED));
			indexWriter.addDocument(document);
			is.close();
			reader.close();
			System.out.println(strBuffer.toString());

		}
		indexWriter.close();
		directory.close();

	}

}

  

package com.fxr.test2;

import java.io.IOException;

import org.apache.lucene.document.Document;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;

public class TestFileSearch {

	/**
	 * @param args
	 * @throws IOException
	 */
	public static void main(String[] args) throws IOException {
		String indexDir = "f:/ChinesLuceneIndex";
		Directory directory = FSDirectory.getDirectory(indexDir);
		IndexSearcher indexSearcher = new IndexSearcher(directory);
		ScoreDoc [] hits = null;
		Term term = new Term("contents","中国");
		TermQuery query = new TermQuery(term);
		TopDocs topDocs = indexSearcher.search(query, 100);
		hits = topDocs.scoreDocs;
		for(int i=0;i<hits.length;i++){
			Document doc = indexSearcher.doc(hits[i].doc);
			 System.out.print(hits[i].score+" ");
				System.out.println(doc.get("fileName")+" ");
				System.out.println(doc.get("contents")+" ");

		}

		indexSearcher.close();
		directory.close();

	}

}

  

package com.fxr.test2;

import java.io.IOException;

import net.paoding.analysis.analyzer.PaodingAnalyzer;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;

public class TestIndex {

	/**
	 * 中文分词的效果
	 * @throws IOException
	 */
	public static void main(String[] args) throws IOException {
		String [] ids = {"1","2","3","4"};
		String [] names = {"张三","李逵","zhangsan","zhangsun"};
		String [] addresses = {"居住在北京","居住在南京","北京海淀","nanning"};
		String [] birthdays = {"19820720","19840203","19770409","19830130"};
		Analyzer analyzer = new PaodingAnalyzer();
		String indexDir = "f:/ChinesLuceneIndex";
		Directory directory = FSDirectory.getDirectory(indexDir);
		//true表示创建或者覆盖当前的索引,FALSE表示当前的索引进行追加
		IndexWriter indexWriter = new IndexWriter(directory,analyzer,true,IndexWriter.MaxFieldLength.LIMITED);
		for(int i=0;i<ids.length;i++){
			Document document = new Document();
			document.add(new Field("id",ids[i],Field.Store.YES,Field.Index.ANALYZED));
			document.add(new Field("name",names[i],Field.Store.YES,Field.Index.ANALYZED));
			document.add(new Field("address",addresses[i],Field.Store.YES,Field.Index.ANALYZED));
			document.add(new Field("birthday",birthdays[i],Field.Store.YES,Field.Index.ANALYZED));
			indexWriter.addDocument(document);
		}
		indexWriter.optimize();
		indexWriter.close();
		System.out.println("ok!");

	}

}
============================================
package com.fxr.test2;

import java.io.IOException;

import net.paoding.analysis.analyzer.PaodingAnalyzer;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocCollector;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;

public class TestQueryParser {

	/**
	 * @param args
	 * @throws IOException
	 * @throws ParseException
	 */
	public static void main(String[] args) throws IOException, ParseException {
		String indexDir = "f:/ChinesLuceneIndex";
		Analyzer analyzer = new PaodingAnalyzer();
		Directory directory = FSDirectory.getDirectory(indexDir);
		IndexSearcher indexSearcher = new IndexSearcher(directory);
		ScoreDoc [] hits = null;
		QueryParser parser = new QueryParser("address",analyzer);
		Query query = parser.parse("(海淀 OR 居住)AND北京");
		TopDocCollector topdoc = new TopDocCollector(100);
		indexSearcher.search(query,topdoc);
		hits = topdoc.topDocs().scoreDocs;
		for(int i=0;i<hits.length;i++){
			Document doc=indexSearcher.doc(hits[i].doc);
		    System.out.print(hits[i].score+" ");
			System.out.print(doc.get("id")+" ");
			System.out.print(doc.get("name")+" ");
			System.out.print(doc.get("address")+" ");
			System.out.println(doc.get("birthday")+" ");
		}
		indexSearcher.close();
		directory.close();

	}

}
==========================================
package com.fxr.test2;

import java.io.IOException;

import org.apache.lucene.document.Document;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.PrefixQuery;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.WildcardQuery;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;

public class TestSearch {

	/**
	 * @param args
	 * @throws IOException
	 */
	public static void main(String[] args) throws IOException {
		String indexDir = "f:/ChinesLuceneIndex";
		Directory dir = FSDirectory.getDirectory(indexDir);
		IndexSearcher indexSearcher = new IndexSearcher(dir);
		ScoreDoc [] hits = null;
		Term term = new Term("address","*海*");
		//TermQuery termQuery = new TermQuery(term);
		//PrefixQuery prefixQuery = new PrefixQuery(term);
		WildcardQuery wildcardQuery = new WildcardQuery(term);
		TopDocs topDocs = indexSearcher.search(wildcardQuery, 100);
		hits = topDocs.scoreDocs;
		for(int i=0;i<hits.length;i++){
			Document doc = indexSearcher.doc(hits[i].doc);
			System.out.print(hits[i].score);
			System.out.print(doc.get("id")+" ");
			System.out.print(doc.get("name")+" ");
			System.out.print(doc.get("address")+" ");
			System.out.println(doc.get("birthday")+" ");
		}
		indexSearcher.close();
		dir.close();

	}

}

  

时间: 2024-10-25 12:14:49

Lucene中文分词的相关文章

当前几个主要的Lucene中文分词器的比较

1. 基本介绍: paoding:Lucene中文分词"庖丁解牛" Paoding Analysis imdict :imdict智能词典所采用的智能中文分词程序 mmseg4j: 用 Chih-Hao Tsai 的 MMSeg 算法 实现的中文分词器 ik :采用了特有的"正向迭代最细粒度切分算法",多子处理器分析模式 2. 开发者及开发活跃度: paoding :qieqie.wang, google code 上最后一次代码提交:2008-06-12,svn

lucene中文分词——(四)

1.分析器的执行过程: 第一个 TokenFilter将大写字母变为小写,第二次分词去掉空格并换行,第三次去掉不要的 and或者标点符号 2.中文分词器介绍: (1)lucene自带的 (2)第三方的 3.查看标准分词器对中文的分词效果: 最终决定使用的是IKAnalyzer()分词器,支持中文扩展与停用. 1 // 查看标准分析器的分词效果 2 @Test 3 public void testTokenStream() throws Exception { 4 // 创建一个标准分析器对象 5

(转)Lucene中文分词图解

本文记录Lucene+Paoding的使用方法图解: 一.下载Lucene(官网:http://archive.apache.org/dist/lucene/java/)本文中使用的是:2.9.4,下载后解压,Lucene所需要的基本jar文件如下列表: lucene-core-2.9.4.jar                   Lucene核心jar lucene-analyzers-2.9.4.jar            Lucene分词jar lucene-highlighter-2

java+lucene中文分词,来看看百度究竟是怎么找到你想要的(十分重要,楼主幸苦之作)

我想只要是学过数据库的孩纸,不管是mysql,还是sqlsever,一提到查找,本能的想到的便是like关键字,其实去转盘网(分类模式)之前也是采用这种算法,但我可以告诉大家一个很不幸的事情,like匹配其实会浪费大量的有用资源,原因这里不说了请自己想一想,我们还是直接摆事实验证. 现在用去转盘网搜:hello 找个单词,如下: http://www.quzhuanpan.com/source/search.action?q=hello&currentPage=1 翻页你会发现只要是包含hell

lucene中文分词搜索的核心代码

public static void search(String indexDir,String q)throws Exception{ Directory dir=FSDirectory.open(Paths.get(indexDir)); IndexReader reader=DirectoryReader.open(dir); IndexSearcher is=new IndexSearcher(reader); // Analyzer analyzer=new StandardAnaly

【Lucene】Apache Lucene全文检索引擎架构之中文分词和高亮显示

前面总结的都是使用Lucene的标准分词器,这是针对英文的,但是中文的话就不顶用了,因为中文的语汇与英文是不同的,所以一般我们开发的时候,有中文的话肯定要使用中文分词了,这一篇博文主要介绍一下如何使用smartcn中文分词器以及对结果的高亮显示. 1. 中文分词 使用中文分词的话,首先到添加中文分词的jar包. <!-- lucene中文分词器 --> <dependency> <groupId>org.apache.lucene</groupId> <

Lucene基础(三)-- 中文分词及高亮显示

Lucene分词器及高亮 分词器 在lucene中我们按照分词方式把文档进行索引,不同的分词器索引的效果不太一样,之前的例子使用的都是标准分词器,对于英文的效果很好,但是中文分词效果就不怎么样,他会按照汉字的字直接分词,没有词语的概念. 使用分词的地方只需要把Analyzer实例化成我们第三方的分词器即可 中文分词有很多,这里使用IKAnalyzer 为例, 下载地址 https://git.oschina.net/wltea/IK-Analyzer-2012FF 现在下来后里面有一篇教程. 高

Lucene的中文分词器IKAnalyzer

分词器对英文的支持是非常好的. 一般分词经过的流程: 1)切分关键词 2)去除停用词 3)把英文单词转为小写 但是老外写的分词器对中文分词一般都是单字分词,分词的效果不好. 国人林良益写的IK Analyzer应该是最好的Lucene中文分词器之一,而且随着Lucene的版本更新而不断更新,目前已更新到IK Analyzer 2012版本. IK Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包.到现在,IK发展为面向Java的公用分词组件,独立于Lucene项目,同时

Sphinx + Coreseek 实现中文分词搜索

Sphinx + Coreseek 实现中文分词搜索 Sphinx Coreseek 实现中文分词搜索 全文检索 1 全文检索 vs 数据库 2 中文检索 vs 汉化检索 3 自建全文搜索与使用Google等第三方站点提供的站内全文搜索的差别 Sphinx Coreseek介绍 Coreseek安装使用 1. 全文检索 1.1 全文检索 vs. 数据库 全文检索是数据库的有力补充,全文检索并不能替代数据库在应用系统中的作用.当应用系统的数据以大量的文本信息为主时,採用全文检索技术能够极大的提升应