2011-11-11 42 views
0

我正在使用Lucene的荧光笔突出显示部分字符串。下面的代码似乎很适合查找词干的词,但不适用于前缀匹配。Lucene荧光笔不匹配前缀

EnglishAnalyzer analyzer = new EnglishAnalyzer(Version.LUCENE_34); 
QueryParser parser = new QueryParser(Version.LUCENE_30, "", analyzer); 
Query query = parser.parse(pQuery); 

QueryScorer scorer = new QueryScorer(query); 
Fragmenter fragmenter = new SimpleSpanFragmenter(scorer, 40); 

Highlighter highlighter = new Highlighter(scorer); 
highlighter.setTextFragmenter(fragmenter); 

String[] frags = highlighter.getBestFragments(analyzer, "", pText, 4); 

我读过几个不同的地方,我需要调用Query.rewrite来使前缀匹配工作。该方法需要一个IndexReader的争论,但我不知道如何得到它。所有的例子中,我发现调用Query.rewreite不会显示IndexReader来自哪里。我会补充说这是我使用的唯一Lucene代码。我没有使用Lucene来进行搜索,只是为了突出显示。

如何创建IndexReader并且如果我以我的方式使用Lucene,可以创建一个IndexReader。或者也许有不同的方式让它突出显示前缀匹配?我对Lucene非常陌生,我敢肯定,所有这些作品都是如此,或者它们都是必需的。我刚刚从网上找到的各种示例中复制了它们。所以如果我还有其他问题,请告诉我。谢谢。

回答

0

假设您有查询field:abc*query.rewrite基本上做的是:它读取索引(这就是为什么你需要一个IndexReader)找到以abc开头的所有条款,并将您的查询更改为,例如,field:abc1 field:abc2 field:abc3。如果您知道索引的位置,则可以使用IndexReader.Open来获取IndexReader。如果你根本没有索引,你应该搜索你的pText,找到以abc开头的所有词并相应地更新你的查询。

+0

是的,我没有索引。这就是我在整个应用中获得的所有Lucene代码。因此,一旦我在pText中找到该单词的所有位置位置,我将调用哪个更新我的Query对象的信息? – Zip184

+0

您不需要位置/位置,只需查找单词,添加到列表/数组,然后创建一个查询字符串,如'field:abc1 field:abc2 field:abc3'并将其提供给查询解析器。 –

+0

这个技巧。谢谢! – Zip184