package com.suning.search.app.util;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.DocsAndPositionsEnum;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Terms;
import org.apache.lucene.index.TermsEnum;
import org.apache.lucene.search.DocIdSetIterator;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
public class Demo {
private static String PARTNUMBER="partnumber";
private static String CATENTDESC="catentdesc";
public static void main(String[] args){
Directory indexDirectory=null;
IndexReader indexReader = null;
Map<String, String> map=new HashMap<String, String>();
try {
indexDirectory = FSDirectory.open(new File(
"/opt/search/query/indexs/bs/electric/index.20151231154016685"));
indexReader = DirectoryReader.open(indexDirectory);
for (int i = 0; i < indexReader.numDocs(); i++) {
int docId=i;
getValues(docId,indexReader,map);
}
for(int i=1;i<11;i++){
Map<String, String> writemap=new HashMap<String, String>();
for(String key:map.keySet()){
if(key.endsWith(i+"")){
writemap.put(key, map.get(key));
}
}
SerializeUtil
.serialize("/opt/search/query/txt/positionInfo"+i+".obj", writemap);// 生成序列化文件
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(indexReader!=null){
indexReader.close();
}
if(indexDirectory!=null){
indexDirectory.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
private static void getValues(int docId,IndexReader indexReader,Map<String, String> map){
Terms cterms;
String term="";
DocsAndPositionsEnum docsAndPositions = null;
try {
Document doc=indexReader.document(docId);
String partnumber=doc.get(PARTNUMBER);
cterms = indexReader.getTermVector(docId, CATENTDESC);
if(cterms!=null){
TermsEnum termsEnums = cterms.iterator(null);
while( termsEnums.next() != null){
term = termsEnums.term().utf8ToString();
docsAndPositions = termsEnums.docsAndPositions(null, docsAndPositions);
if(docsAndPositions == null){
continue;
}
int docid = docsAndPositions.nextDoc();
if(docid == DocIdSetIterator.NO_MORE_DOCS){
continue;
}
int position = docsAndPositions.nextPosition();
int startOffset = docsAndPositions.startOffset();
int endOffset=docsAndPositions.endOffset();
String key=term+partnumber;
map.put(key, startOffset+","+endOffset);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
工具类
<pre name="code" class="html">package com.suning.search.app.util;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SerializeUtil {
private final static Logger logger = LoggerFactory
.getLogger(SerializeUtil.class);
// 序列化对象到文件
public static void serialize(String fileName, Object o) {
try {
// 创建一个对象输出流,讲对象输出到文件
ObjectOutputStream out = new ObjectOutputStream(
new FileOutputStream(fileName));
out.writeObject("序列化日期是:"); // 序列化一个字符串到文件
out.writeObject(new Date()); // 序列化一个当前日期对象到文件
out.writeObject(o); // 序列化一个会员对象
out.close();
} catch (Exception x) {
logger.error(x.toString());
}
}
// 从文件反序列化到对象
public static Object deserialize(String fileName) {
Object result = null;
try {
// 创建一个对象输入流,从文件读取对象
ObjectInputStream in = new ObjectInputStream(new FileInputStream(
fileName));
// 注意读对象时必须按照序列化对象顺序读,否则会出错
// 读取字符串
String today = (String) (in.readObject());
// 读取日期对象
Date date = (Date) (in.readObject());
// 读取对象并调用它的toString()方法
result = in.readObject();
in.close();
} catch (Exception x) {
logger.error(x.toString(), "读取文件" + fileName + "失败");
}
return result;
}
public static void main(String[] args) {
Map<String, Object> mm = new HashMap<String, Object>();
Map<String, Map<String, Object>> m2 = new HashMap<String, Map<String, Object>>();
Map<String, Map<String, Object>> m3 = new HashMap<String, Map<String, Object>>();
Map<String, Map<String, Object>> m4 = new HashMap<String, Map<String, Object>>();
mm.put("brand", "12345");
m2.put("child", mm);
m3.put("child", mm);
m4.put("child", mm);
Collection<Map<String, Map<String, Object>>> ms = new ArrayList<Map<String, Map<String, Object>>>();
ms.add(m2);
ms.add(m3);
ms.add(m4);
serialize("/opt/search/obj.ser", ms);
Collection<Map<String, Map<String, Object>>> deser = (Collection<Map<String, Map<String, Object>>>) deserialize("/opt/search/obj.ser");
System.out.println(deser);
Iterator<Map<String, Map<String, Object>>> it = deser.iterator();
Map<String, Map<String, Object>> m5 = it.next();
m5.get("child").put("brand", "6");
Map<String, Map<String, Object>> m6 = it.next();
Map<String, Map<String, Object>> m7 = it.next();
System.out.println(m5 == m6);
System.out.println(m5.get("child") == m6.get("child"));
System.out.println(m6.get("child").get("brand"));
}
}