如何在Java中Lucene heighlighting中的文本之间显示空格 导入java.io.File; 导入java.io.FileOutputStream; 导入java.io.StringReader; 导入org.apache.lucene.analysis.TokenStream; 导入org.apache.lucene.analysis.standard.StandardAnalyzer; 导入org.apache.lucene.index.Term; 导入org.apache.lucene.search.TermQuery; 导入org.apache.lucene.search.highlight.Fragmenter; 导入org.apache.lucene.search.highlight.QueryScorer; 导入org.apache.lucene.search.highlight.SimpleFragmenter; 导入org.apache.lucene.search.highlight.SimpleHTMLFormatter; 导入org.apache.lucene.util.Version; 公共类myclass{ 公共静态void main(字符串[]args){ FileOutputStream文件=null; String result=“(i)认可协会应获得根据《1952年远期合同(监管)法》(1952年第74号)设立的远期市场委员会关于衍生品交易的批准,并应按照远期市场委员会规定的指导方针或条件运作;”; 试一试{ TermQuery query=新TermQuery(新术语(“f”,“远期市场”)); QueryScorer scorer=新的QueryScorer(查询); SimpleHTMLFormatter格式化程序=新的SimpleHTMLFormatter( "", ""); org.apache.lucene.search.Highlighter Highlighter=新org.apache.lucene.search.Highlighter.Highlighter( 格式化程序、记分器); Fragmenter Fragmenter=新的SimpleFragmenter(result.length()); 荧光灯。setTextFragmenter(fragmenter); TokenStream TokenStream=新的StandardAnalyzer(Version.LUCENE_29) .tokenStream(“f”, 新StringReader(结果)); String result1=highlighter.getBestFragments(令牌流、结果、, 1, "..."); if(result1.length()=0){ 结果1=结果; } 字符串finalhtml=“”+”\n“+”。突出显示{\n” +背景:黄色;\n“+”}\n“+”+” +结果1+“”; 字节[]contentInBytes=finalhtml.getBytes(); file=newfileoutputstream(新文件(“E:\\myhtml.html”); file.write(内容字节); flush()文件; file.close(); }捕获(例外情况除外){ } } }

如何在Java中Lucene heighlighting中的文本之间显示空格 导入java.io.File; 导入java.io.FileOutputStream; 导入java.io.StringReader; 导入org.apache.lucene.analysis.TokenStream; 导入org.apache.lucene.analysis.standard.StandardAnalyzer; 导入org.apache.lucene.index.Term; 导入org.apache.lucene.search.TermQuery; 导入org.apache.lucene.search.highlight.Fragmenter; 导入org.apache.lucene.search.highlight.QueryScorer; 导入org.apache.lucene.search.highlight.SimpleFragmenter; 导入org.apache.lucene.search.highlight.SimpleHTMLFormatter; 导入org.apache.lucene.util.Version; 公共类myclass{ 公共静态void main(字符串[]args){ FileOutputStream文件=null; String result=“(i)认可协会应获得根据《1952年远期合同(监管)法》(1952年第74号)设立的远期市场委员会关于衍生品交易的批准,并应按照远期市场委员会规定的指导方针或条件运作;”; 试一试{ TermQuery query=新TermQuery(新术语(“f”,“远期市场”)); QueryScorer scorer=新的QueryScorer(查询); SimpleHTMLFormatter格式化程序=新的SimpleHTMLFormatter( "", ""); org.apache.lucene.search.Highlighter Highlighter=新org.apache.lucene.search.Highlighter.Highlighter( 格式化程序、记分器); Fragmenter Fragmenter=新的SimpleFragmenter(result.length()); 荧光灯。setTextFragmenter(fragmenter); TokenStream TokenStream=新的StandardAnalyzer(Version.LUCENE_29) .tokenStream(“f”, 新StringReader(结果)); String result1=highlighter.getBestFragments(令牌流、结果、, 1, "..."); if(result1.length()=0){ 结果1=结果; } 字符串finalhtml=“”+”\n“+”。突出显示{\n” +背景:黄色;\n“+”}\n“+”+” +结果1+“”; 字节[]contentInBytes=finalhtml.getBytes(); file=newfileoutputstream(新文件(“E:\\myhtml.html”); file.write(内容字节); flush()文件; file.close(); }捕获(例外情况除外){ } } },java,jsp,lucene,Java,Jsp,Lucene,当我将文本设置为“已识别”或“关联”时,这是我的代码。它的突出显示非常完美,但当我设置text=“Forward Markets”它的noe突出显示时,请告诉我哪里出错了。请帮助我如何突出显示文本(如果出现空格)。您的问题是已识别的和关联是术语,但远期市场不是一个术语。这是两个术语,远期和市场,应该按顺序找到。这通常被称为“短语”。可以用来查找它,但通常更简单的方法是只使用查询解析器,如: import java.io.File; import java.io.FileOutputStream;

当我将文本设置为“已识别”或“关联”时,这是我的代码。它的突出显示非常完美,但当我设置text=“Forward Markets”它的noe突出显示时,请告诉我哪里出错了。请帮助我如何突出显示文本(如果出现空格)。

您的问题是
已识别的
关联
是术语,但远期市场不是一个术语。这是两个术语,
远期
市场
,应该按顺序找到。这通常被称为“短语”。可以用来查找它,但通常更简单的方法是只使用查询解析器,如:

import java.io.File;
import java.io.FileOutputStream;

import java.io.StringReader;

import org.apache.lucene.analysis.TokenStream;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.highlight.Fragmenter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleFragmenter;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import org.apache.lucene.util.Version;

public class myclass {
    public static void main(String[] args) {
        FileOutputStream file = null;
        String result = "<html><body><div>(i) the recognised association shall have the approval of the Forward  Markets  Commission established under the Forward  Contracts (Regulation) Act, 1952 (74 of 1952) in respect of trading in derivatives and shall function in accordance with the guidelines or conditions laid down by the Forward  Markets  Commission; </div>  <body> </html>";

        try {

            TermQuery query = new TermQuery(new Term("f", "Forward  Markets"));
            QueryScorer scorer = new QueryScorer(query);
            SimpleHTMLFormatter formatter = new SimpleHTMLFormatter(
                    "<span class=\"highlight\">", "</span>");
            org.apache.lucene.search.highlight.Highlighter highlighter = new org.apache.lucene.search.highlight.Highlighter(
                    formatter, scorer);
            Fragmenter fragmenter = new SimpleFragmenter(result.length());
            highlighter.setTextFragmenter(fragmenter);
            TokenStream tokenStream = new StandardAnalyzer(Version.LUCENE_29)
                    .tokenStream("f",

                    new StringReader(result));
            String result1 = highlighter.getBestFragments(tokenStream, result,
                    1, "...");
            if (result1.length() == 0) {
                result1 = result;
            }
            String finalhtml = "<html>" + "<style>\n" + ".highlight{\n"
                    + " background: yellow;\n" + "}\n" + "</style>" + "<body>"
                    + result1 + "</body></html>";

            byte[] contentInBytes = finalhtml.getBytes();
            file = new FileOutputStream(new File("E:\\myhtml.html"));
            file.write(contentInBytes);
            file.flush();
            file.close();
        } catch (Exception ex) {

        }
    }
}
如果您决定手动构建
短语查询
,请仔细阅读文档。必须将每个术语单独添加到查询中,如:

StandardQueryParser parser = new StandardQueryParser(analyzer);
Query query = parse.parse("f:\"Forward Markets\"")
Query Scorer scorer = new QueryScorer(query);
//.......
同样,在手动构造查询时,请注意分析器。您可以在上面查询是否包含大写字母。不分析手动传递到
TermQuery
的术语。如果您使用带有
小写过滤器的分析器(例如
StandardAnalyzer
),这将导致您找不到任何结果

phrasequery.add(new Term("f", "forward"));
phrasequery.add(new Term("f", "markets"));