lucene3使用示例

lucene插入document建立索引代码

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.LockObtainFailedException;
import org.apache.lucene.util.Version;

public class DocInsert {
	
	private static IndexWriter indexwrite = null;
	static{
		 Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_CURRENT);

		    // Store the index in memory:
//		    Directory directory = new RAMDirectory();
		    // To store an index on disk, use this instead:

		    try {
			    Directory directory = FSDirectory.open(new File("E:\\output\\lucence\\index"));
			    indexwrite = new IndexWriter(directory, analyzer, true,
				                                      new IndexWriter.MaxFieldLength(25000));
			} catch (CorruptIndexException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (LockObtainFailedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		    
	}
	
	public static void createDoc() throws CorruptIndexException, IOException{
		List<String> datalist = org.apache.commons.io.IOUtils.readLines(new InputStreamReader(new FileInputStream(new File("E:\\output\\lucence\\data\\data.txt")),"GBK"));
	    for(String str:datalist){
			Document doc = new Document();
		    String[] text = str.split("\t");
		    if(text.length < 2){
		    	continue;
		    }
		    doc.add(new Field("context", text[1], Field.Store.YES, Field.Index.ANALYZED));
		    doc.add(new Field("id", text[0], Field.Store.YES, Field.Index.ANALYZED));
		    indexwrite.addDocument(doc);	
	    }
	}
	
	public static void main(String[] args) throws CorruptIndexException, IOException {
		createDoc();
		indexwrite.commit();
		indexwrite.close();
	}

}

 

数据格式为:

  4915779 球泡灯套件

4915777	15018506651求购三星i559 i569 i579
4915775	采购雪纺格子印花面料
4915773	汽泡信封袋
4915771	电泳加工
4915769	6405 2RS
4915767	蓝色丁腈手套
4915765	采购求购KO3-15T八角
4915763	胸杯
4915761	封箱胶带
4915759	6404 2RS
4915757	Ipad 车载支架
4915755	礼品,文具,墙贴,基督教礼品
4915753	品牌内衣
4915751	聚丙烯酸
4915749	餐饮消毒毛巾、湿巾
4915747	提花
4915745	6403 2RS
4915743	采购如:葛根粉丝、蕨根粉丝、南瓜粉丝、野菜粉丝、香菇粉丝等
4915741	二手摩托车
4915739	急需采购PVC特殊袋子
4915737	女士T恤
4915735	烤弯镀膜玻璃
4915731	批发野生羊肚菌
4915733	ABS管道粘结剂 ABS胶

 

检索代码示例如下:

import java.io.File;
import java.io.IOException;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexReader;
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.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

public class DocSearch {

	private static IndexSearcher isearcher = null;
	public static void search(String key) throws IOException, ParseException{
		 Directory directory = FSDirectory.open(new File("E:\\output\\lucence\\index"));
		 // Now search the index:
	    IndexReader ireader = IndexReader.open(directory); // read-only=true
	    isearcher  = new IndexSearcher(ireader);
	    // Parse a simple query that searches for "text":
	    Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_CURRENT);
	    QueryParser parser = new QueryParser(Version.LUCENE_CURRENT,"context", analyzer);
	    Query query = parser.parse(key);
	    ScoreDoc[] hits = isearcher.search(query, null, 1000).scoreDocs;
	    // Iterate through the results:
	    for (int i = 0; i < hits.length; i++) {
	      Document hitDoc = isearcher.doc(hits[i].doc);
	      System.out.println(hitDoc.getValues("id")[0] + "\t" + hitDoc.getValues("context")[0] + "\t" + hits[i].score);
	      
	    }
	}
	
	public static void main(String[] args) throws IOException, ParseException {
		search("旧水泥袋");
		isearcher.close();
	}
	
}

 执行结果:

  4801857 采购旧编织袋、旧水泥袋 4.0172114

4829927	水泥	1.7585585
4903199	采购水泥电阻	1.0551351
4815595	求购水泥输送链条和提升机	0.70342344
4861233	1万5 潜水料啤酒手提包 手提袋	0.47982088
4815637	大量采购包装用的编织袋(新的旧的,有无商标皆可)	0.47913262
4915391	铁泥 铁灰	0.46250635
4889169	废旧砂轮	0.39993972
4903163	软陶泥,超轻粘土	0.34687978
4801611	水泵	0.30114633
4801911	手袋	0.29862976
4889443	水锈石 上水石  吸水石	0.2608004
4861275	足浴袋  泡脚袋 异形袋	0.25862095
4801871	手提袋制袋机	0.25339574
4915383	回收库存废旧油墨油漆	0.24996233
4903189	回收库存旧油漆13463048572	0.24996233
4903187	求购废旧油漆油墨13463048572	0.24996233
4903175	求购库存旧化工树脂	0.24996233
4903245	污水泵	0.24091707
4801705	出水霜	0.24091707
4874727	服裝紙袋	0.2389038
4829965	工作证袋	0.2389038
4815531	棉布袋	0.2389038
4815479	冷敷冰袋	0.2389038

 

 

可以看到这个检索结果:

1.默认的分词是最终分成一个汉字,

2.匹配出来的分数还是比较靠谱。

 

 

 

如何用lucene设计一个搜索引擎如何考虑的问题太多:

1.如何设计一个分布式查询;

2.数据增量更新,全量更新如何处理,不影响当前的查询引擎;

3.性能如何保证,更好地利用缓存,分布式?

4.如果设计得更通用,需要添加字段,添加排序字段,统计字段的时候能够做到快速满足需求?

5.分词模块的选择和处理

。。。

 

后续慢慢研究

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Lucene是一个开源的全文搜索引擎库,用于实现文本索引和搜索功能。下面是一个Lucene使用示例: 1. 创建索引: ```java import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; // 创建索引 public class Indexer { public static void main(String[] args) { // 索引存储路径 String indexPath = "path_to_index_directory"; try { // 创建分词器 Analyzer analyzer = new StandardAnalyzer(); // 创建索引配置 IndexWriterConfig config = new IndexWriterConfig(analyzer); // 创建索引目录 Directory directory = FSDirectory.open(Paths.get(indexPath)); // 创建索引写入器 IndexWriter indexWriter = new IndexWriter(directory, config); // 创建文档 Document document = new Document(); document.add(new Field("content", "Hello world!", TextField.TYPE_STORED)); // 将文档添加到索引中 indexWriter.addDocument(document); // 提交索引 indexWriter.commit(); // 关闭索引写入器 indexWriter.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 2. 搜索索引: ```java import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.IndexReader; import org.apache.lucene.queryparser.classic.QueryParser; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TopDocs; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; // 搜索索引 public class Searcher { public static void main(String[] args) { // 索引目录路径 String indexPath = "path_to_index_directory"; try { // 创建分词器 Analyzer analyzer = new StandardAnalyzer(); // 创建索引目录 Directory directory = FSDirectory.open(Paths.get(indexPath)); // 创建索引读取器 IndexReader indexReader = DirectoryReader.open(directory); // 创建索引搜索器 IndexSearcher indexSearcher = new IndexSearcher(indexReader); // 创建查询解析器 QueryParser parser = new QueryParser("content", analyzer); // 创建查询 Query query = parser.parse("Hello"); // 执行查询,获取前n个结果 TopDocs topDocs = indexSearcher.search(query, 10); ScoreDoc[] scoreDocs = topDocs.scoreDocs; // 遍历结果 for (ScoreDoc scoreDoc : scoreDocs) { int docId = scoreDoc.doc; Document document = indexSearcher.doc(docId); System.out.println("Content: " + document.get("content")); } // 关闭索引读取器 indexReader.close(); } catch (IOException | ParseException e) { e.printStackTrace(); } } } ``` 以上示例演示了如何使用Lucene创建索引并进行搜索。在创建索引时,需要定义分词器、索引配置、文档字段等。在搜索索引时,需要创建查询解析器、执行查询并获取结果。你可以根据自己的需求进行更多的定制和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值