public List<QueryResult> excuteQuery3() throws Exception{
		segmentation();
		
		
		// each keyword -- ArrayList<Integer>
		List <ArrayList<Integer>> queryList = new ArrayList<ArrayList<Integer>>(); 
		
		for(String keyword: keywords) {
			ArrayList<Integer> docs = invertedIndex.get(keyword);
			if(docs == null) {
				return null;
			}
			queryList.add(docs);
		}
		
		System.out.println(queryList);
		
		List<Integer> resultDocIds = intersection(queryList);
		
		System.out.println("fit document: " + resultDocIds);
		if(resultDocIds == null || resultDocIds.size() == 0) 
			return null;
		
		
		System.out.println("keyword InvertedIndex: " + new Date());
		
		List<DocTfidf> tfIdfList = new ArrayList<DocTfidf>();
//		Map<Integer, List<ForwardIndex>> forwardMap = new HashMap<Integer, List<ForwardIndex>>();
		List<InvertedIndex> invetedIndexList = IndexDAO.getInvertedIndexList(keywords);
		
		for(Integer docId: resultDocIds) {
			List<ForwardIndex> forwardIndexList = IndexDAO.getForwardIndexList(docId, keywords);
			
			double sum = 0.0;
			for(int i = 0; i < invetedIndexList.size(); ++i) {
				sum += invetedIndexList.get(i).getIdf() * forwardIndexList.get(i).getTermfre();
			}
			
			tfIdfList.add(new DocTfidf(docId, sum));
			
		}
		
		Collections.sort(tfIdfList);
		

		System.out.println("top N : " + new Date());
		// accrodding to TF/IDF sorted docId list
		List<Integer> sortedDoc = new ArrayList<Integer>();
		if(tfIdfList.size() > MAX_RET_RESULT_NUM) {
			for(int i = 0; i < MAX_RET_RESULT_NUM; ++i) {
				sortedDoc.add(tfIdfList.get(i).getDocId());
			}
		}
		else {
			for(DocTfidf entry: tfIdfList) {
				sortedDoc.add(entry.getDocId());
			}
		}

		System.out.println("get pageList : " + new Date());
		List<PageInfo> pageInfoList = PageDAO.getPageList(sortedDoc);
		
		System.out.println("get result: " +new Date());
		result = generateQueryResult(pageInfoList, keywords.get(0));
		
		System.out.println("end: query results: " + result.size());

		return result;
	}