增加荧光笔返回的文本长度

时间:2016-03-24 09:11:11

标签: lucene full-text-search highlight

最初,我认为setMaxDocCharsToAnalyze(int)会增加输出长度,但事实并非如此。

目前,我的搜索(String fragment)生成的输出小于一行,因此无法作为预览

getBestFragment()生成的输出是否可以通过某种机制增加到至少1个句子或更多(如果它是一个半句或更多,则无关紧要,但我需要它很长足以至少使一些感觉到)。

索引:

Document document = new Document();
document.add(new TextField(FIELD_CONTENT, content, Field.Store.YES));
document.add(new StringField(FIELD_PATH, path, Field.Store.YES));
indexWriter.addDocument(document);

搜索

QueryParser queryParser = new QueryParser(FIELD_CONTENT, new StandardAnalyzer());
Query query = queryParser.parse(searchQuery);
QueryScorer queryScorer = new QueryScorer(query, FIELD_CONTENT);
Fragmenter fragmenter = new SimpleSpanFragmenter(queryScorer);

Highlighter highlighter = new Highlighter(queryScorer); // Set the best scorer fragments
highlighter.setMaxDocCharsToAnalyze(100000); //"HAS NO EFFECT"
highlighter.setTextFragmenter(fragmenter); 

// STEP B
File indexFile = new File(INDEX_DIRECTORY);
Directory directory = FSDirectory.open(indexFile.toPath());
IndexReader indexReader = DirectoryReader.open(directory);

// STEP C
System.out.println("query: " + query);
ScoreDoc scoreDocs[] = searcher.search(query, MAX_DOC).scoreDocs;
for (ScoreDoc scoreDoc : scoreDocs)
{
    //System.out.println("1");
    Document document = searcher.getDocument(scoreDoc.doc);
    String title = document.get(FIELD_CONTENT);
    TokenStream tokenStream = TokenSources.getAnyTokenStream(indexReader,
                    scoreDoc.doc, FIELD_CONTENT, document, new StandardAnalyzer());
    String fragment = highlighter.getBestFragment(tokenStream, title); //Increase the length of the this String this is the output
    System.out.println(fragment + "-------");
 }

样本输出

  

查询:+内容:加拿大+内容:部长
  | [自由]] [[部长 加拿大 | Prime 部长]] [[Pierre Trudeau]]领导[[少数民族---] ----
  。渥太华国家战争服务部的Thorson,部长加拿大印刷描述:英国狮子-------
   [新西兰工党]的政治家工党]]和内阁部长。他代表-------
  |}}} | ! [[财务部长加拿大)| 部长]] {{!}} {{{部长 - ------
  ,富兰克林区&#39;。渥太华:供应和服务部长 加拿大,1977年。国际标准书号0660008351    25]],[[1880]] - [[3月4日]],[[1975]])是[[加拿大 |加拿大]]省和联邦------- <登记/>   -du-Quebec]]地区,[[加拿大]]。它以第一位法国加拿大人的名字命名为Prime-----   11569347,Cannon_family _(加拿大)::: {{for |美国政治家庭| Cannon家族-------
   [[圭亚那]的部长和[[圭亚那]]的着名印度教政治家。他还在不同的时间服务-------   11559743,Mohammed_Hussein_Al_Shaali :::&#39;&#39;&#39; Mohammed Hussein Al Shaali&#39;&#39;&#39;是部长 -------

1 个答案:

答案 0 :(得分:4)

Fragmenter是控制此行为的部分。您可以将int传递给SimpleSpanFragmenter构造函数来控制它生成的片段的大小(以字节为单位)。默认大小为100.例如,要加倍:

Fragmenter fragmenter = new SimpleSpanFragmenter(queryScorer, 200);

就分裂句子边界而言,没有开箱即用的碎片。有人张贴了他们的implementation of one here。这是一个非常天真的实现,但是如果你想要去那个特定的兔子洞,你会发现它很有帮助。