Lucene基础篇1 概论

在学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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。