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

Vul*_*can 2 lucene full-text-search highlight

最初,我以为setMaxDocCharsToAnalyze(int)会增加输出长度,但不会。

目前,我的Search(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);
Run Code Online (Sandbox Code Playgroud)

正在搜寻

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 + "-------");
 }
Run Code Online (Sandbox Code Playgroud)

样本输出

查询:+内容:加拿大+内容:部长
|文]] [[总理大臣加拿大 |总理大臣 ]] [[特鲁多领导]一个[少数-------
。渥太华国家战争事务部长索尔森。加拿大印刷 说明:
[[新西兰工党| 工党],以及内阁大臣。他代表-------
|}}} || ![ 部长财务(加拿大)| 部长 ]] {{!}} {{{ 部长 -------
,富兰克林区”。渥太华:部长加拿大供应与服务,1977年。ISBN0660008351 25]],[[1880]] – [[3月4日],[[1975]])是[[ 加拿大 |加拿大]]省级和联邦政府---- ---
du-Quebec]]区域,位于[[ Canada ]]。它以第一位成为总理的加拿大加拿大人的名字命名-------
11569347,Cannon_family_(Canada)::: {{for |美国政治家族|大炮家族------- [圭亚那
部长 ]]和[[Guyana]]中著名的印度教政治家。他还曾在不同时期任职-------
11559743,Mohammed_Hussein_Al_Shaali :::'``Mohammed Hussein Al Shaali'''是前任部长 -------

fem*_*gon 5

Fragmenter是控制这种行为的一块。您可以将传递intSimpleSpanFragmenter构造函数,以控制其产生的片段的大小(以字节为单位)。默认大小为100。例如,将其加倍:

Fragmenter fragmenter = new SimpleSpanFragmenter(queryScorer, 200);
Run Code Online (Sandbox Code Playgroud)

至于在句子边界上进行拆分,没有开箱即用的碎片处理程序。有人在这里发布了他们的实现。这是一个非常幼稚的实现,但是如果您想深入研究特定的兔子洞,可能会发现它很有用。