java搜索命中算法_java – 从Lucene中找到搜索命中的位置

我使用的是TermFreqVector.这是一个工作演示,它打印术语位置,以及起始和结束术语索引:

public class Search {

public static void main(String[] args) throws IOException, ParseException {

Search s = new Search();

s.doSearch(args[0], args[1]);

}

Search() {

}

public void doSearch(String db, String querystr) throws IOException, ParseException {

// 1. Specify the analyzer for tokenizing text.

// The same analyzer should be used as was used for indexing

StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_CURRENT);

Directory index = FSDirectory.open(new File(db));

// 2. query

Query q = new QueryParser(Version.LUCENE_CURRENT, "contents", analyzer).parse(querystr);

// 3. search

int hitsPerPage = 10;

IndexSearcher searcher = new IndexSearcher(index, true);

IndexReader reader = IndexReader.open(index, true);

searcher.setDefaultFieldSortScoring(true, false);

TopScoreDocCollector collector = TopScoreDocCollector.create(hitsPerPage, true);

searcher.search(q, collector);

ScoreDoc[] hits = collector.topDocs().scoreDocs;

// 4. display term positions, and term indexes

System.out.println("Found " + hits.length + " hits.");

for(int i=0;i

int docId = hits[i].doc;

TermFreqVector tfvector = reader.getTermFreqVector(docId, "contents");

TermPositionVector tpvector = (TermPositionVector)tfvector;

// this part works only if there is one term in the query string,

// otherwise you will have to iterate this section over the query terms.

int termidx = tfvector.indexOf(querystr);

int[] termposx = tpvector.getTermPositions(termidx);

TermVectorOffsetInfo[] tvoffsetinfo = tpvector.getOffsets(termidx);

for (int j=0;j

System.out.println("termpos : "+termposx[j]);

}

for (int j=0;j

int offsetStart = tvoffsetinfo[j].getStartOffset();

int offsetEnd = tvoffsetinfo[j].getEndOffset();

System.out.println("offsets : "+offsetStart+" "+offsetEnd);

}

// print some info about where the hit was found...

Document d = searcher.doc(docId);

System.out.println((i + 1) + ". " + d.get("path"));

}

// searcher can only be closed when there

// is no need to access the documents any more.

searcher.close();

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、课程设计目的 通过请求页式管理方式页面置换算法的模拟设计,了解虚拟存储技术的特点,掌握请 求页式存储管理的页面置换算法。 容 二、课程设计内容 模拟实现 OPT(最佳置换)、FIFO 和 LRU 算法,并计算缺页率。 示 三、要求及提示 本题目必须单人完成。 1、首先用随机数生成函数产生一个“指令将要访问的地址序列”,然后将地址序列变换 成相应的页地址流(即页访问序列),再计算不同算法下的命中率。 2、通过随机数产生一个地址序列,共产生 400 条。其 50%的地址访问是顺序执行的, 另外 50%就是非顺序执行。且地址在前半部地址空间和后半部地址空间均匀分布。具体产 生方法如下: 1) 在前半部地址空间,即[0,199]随机选一数 m,记录到地址流数组(这是 非顺序执行); 2) 接着“顺序执行一条指令”,即执行地址为 m+1 的指令,把 m+1 记录下来; 3) 在后半部地址空间,[200,399]随机选一数 m’,作为新指令地址; 4) 顺序执行一条指令,其地址为 m’+1; 5) 重复步骤 1~4,直到产生 400 个指令地址。 3、将指令地址流变换成页地址(页号)流,简化假设为: 1) 页面大小为 1K(这里 K 只是表示一个单位,不必是 1024B); 2) 用户虚存容量为 40K; 3) 用户内存容量为 4 个页框到 40 个页框; 6 4) 用户虚存,每 K 存放 10 条指令,所以那 400 条指令访问地址所对应的页地 址(页号)流为:指令访问地址为[0,9]的地址为第 0 页;指令访问地址为[10, 19]的地址为第 1 页;……。按这种方式,把 400 条指令组织进“40 页”,并 将“要访问的页号序列”记录到页地址流数组。 4、循环运行,使用户内存容量从 4 页框到 40 页框。计算每个内存容量下不同页面置换 算法命中率。输出结果可以为: 页框数 OPT 缺页率 FIFO 缺页率 LRU 缺页率 [4] OPT:0.5566 FIFO:0.4455 LRU:0.5500 [5] OPT:0.6644 FIFO:0.5544 LRU:0.5588 …… …… …… …… [39] OPT:0.9000 FIFO:0.9000 LRU:0.9000 [40] OPT:1.0000 FIFO:1.0000 LRU:1.0000 注 1:在某一次实验,可能 FIFO 比 LRU 性能更好,但足够多次的实验表明 LRU 的平均性能比 FIFO 更好。 注 2:计算缺页率时,以页框填满之前和之后的总缺页次数计算。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值