2010-11-20 67 views
1

在Lucene中,我使用SnowballAnalyzer进行索引和搜索。在Lucene中获取词干

当我建立索引时,我对索引进行查询。例如,我为字段“body”制作了一个“专业”查询。 IndexSearcher返回包含'specialize,special等'的文档。因为SnowballAnalyzer完成了干扰。

现在 - 拥有顶级文档 - 我想从正文字段中获取文本片段。这个剪辑应该包含查询词的词干版本。
例如,其中一份退回的文件包含身体领域:“不幸的是,在一些州,盲人只能访问为各种残疾人服务的普通康复机构,在这些情况下,为视障人士提供专业服务并不总是可用的。“ 然后我希望得到的部分'在这些情况下,视觉专业服务'作为片段。 此外,我想从这个片段有条款。代码将做到这一点,但有一个标记'?'性格,在这里我有一个问题是:

如何我想这样做是 IndexReader ir = IndexReader.open(fsDir);
TermPositionVector tv = (TermPositionVector)ir.getTermFreqVector(hits.scoreDocs[i].doc, "body");

? - 这里:查询 - 查询必须是这个词。所以如果真正的查询 是'专业',那么查询应该是专门化的,通常是雪球分析仪所做的。我怎样才能让分析器对单个词或短语进行分析,因为查询可以包含一个短语:“专用机器”。

int idx = tv.indexOf(query);
int [] idxs = tv.getTermPositions(idx);
for(String t : tv.getTerms()){
int iidx = tv.indexOf(t);
int [] iidxs = tv.getTermPositions(iidx);
for(int ni : idxs){
tmpValue = 0.0f;
for(int nni : iidxs){
if(Math.abs(nni-ni)<= Settings.termWindowSize){

编辑
我发现,以获得长期朵朵方式:
Query q = queryParser.parse("some text to be parsed"); String parsedQuery = q.toString();
没有为查询对象toString(String fieldName)的方法;

回答

0

我相信你在混合几个问题。 首先,要查看查询的词干版本以及其他有用信息,可以使用IndexSearcher的explain()方法。请参阅my answer to this question

Lucene获取片段的解决方案是Highlighter。另一种选择是FastVectorHighlighter。我相信你可以定制这两个词,而不是完整词。

+0

Thx为您的答复。请参阅我的帖子更新以查看获取词干术语的方法。 – Jakub 2010-11-21 19:13:51