在学lucene 之初看了许多书,都是走马观花,没有项目的驱动下,来一个用例demo感觉也不是很难,“我会了”这是我的第一感觉。
在2013年底公司接到一个项目用到lucene,这是我第一次正真接触Lucene,代码比较老3.6版本,不适合新项目的需求(空间查询)。于是下载了最新版本 4.51,有带“空间查询”模块。各大搜索引擎都没有找到像样例子,于是想到了lucene svn的 trunk目录测试用例中找到了测试例子,开始了一段lucene之旅。
写数据,创建IndexWriter,通过它的构造函数需要一个索引目录(Diectory)和索引写入配置项(InderWriterConfig),直接上代码:
//设置写入目录(好几种呵呵)
Directory d=FSDirectory.open(new File("D:/luceneTest"));
//设置分词 StandardAnalyzer(会把句子中的字单个分词)
Analyzer analyzer= new StandardAnalyzer(Version.LUCENE_45);
//设置索引写入配置
IndexWriterConfig config=new IndexWriterConfig(Version.LUCENE_45,analyzer);
//设置创建模式
//config.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);
IndexWriter indexwriter= new IndexWriter(d,config);
上面四行代码就创建好了indexwriter,下面把数据填入就好了,写入有多种方式如下图:
用 addDocment 举例代码如下:
Document doc=new Document();
doc.add(new StringField("id", "1", Store.YES));
doc.add(new StringField("name", "brockhong", Store.YES));
doc.add(new TextField("content", "lucene 文档第一次写看着给分吧", Store.YES));
//写入数据
indexwriter.addDocument(doc);
//提交
indexwriter.commit();
用 Luke 工具查看Text列,这是标准分词惹的祸哦!写入成功。
读数据查询,创建 IndexSearcher 构造函数设置indexReader ,输入查询条件,上面content字段数据设置了分词,所以必须通过查询解析类QueryParser设定分词字段、版本、分词模式,并通过parse方法得到查询条件。代码如下:
//读数据
//创建 indexReader 这个已过时 IndexReader.open(d),里面的代码一样可能为了兼容老版本
IndexReader indexReader = DirectoryReader.open(d);
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
//查询 设置分词字段
QueryParser queryParser = new QueryParser(Version.LUCENE_45, "content",
new StandardAnalyzer(Version.LUCENE_45));
//or 关系 “给”、“分”
queryParser.setDefaultOperator(QueryParser.OR_OPERATOR);
Query query = queryParser.parse("给分");
TopDocs results = indexSearcher.search(query, 100);
int numTotalHits = results.totalHits;
System.out.println("共 " + numTotalHits + " 完全匹配的文档");
ScoreDoc[] hits = results.scoreDocs;
for (int i = 0; i < hits.length; i++) {
Document document = indexSearcher.doc(hits[i].doc);
System.out.println("content:" + document.get("content"));
}
pasting