8 lucene.net nhibernate.search
我试图在一个HTML块中突出显示搜索词,问题是如果用户搜索"颜色",这个:
<span style ='color:white'>白色</ span>
成为:<span style =' <b>颜色</ b>:白色'> <b>白色</ b> </ span>
显然,弄乱我的风格并不是一个好主意.
这是我正在使用的代码:
Query parsedQuery = parser.Parse(luceneQuery);
StandardAnalyzer Analyzer = new StandardAnalyzer();
SimpleHTMLFormatter formatter = new SimpleHTMLFormatter("<b class='search'>", "</b>");
QueryScorer scorer = new QueryScorer(parsedQuery);
Highlighter highlighter = new Highlighter(formatter, scorer);
highlighter.SetTextFragmenter(new SimpleFragmenter());
Highlighter.GetBestFragment(Analyzer, propertyName, invocation.ReturnValue.ToString())
Run Code Online (Sandbox Code Playgroud)
我猜这个问题是我需要一个不同的Fragmenter,但我不确定.任何帮助,将不胜感激.
小智 3
我想我已经明白了...
我将 StandardAnalyzer 子类化并将 TokenStream 更改为:
public override Lucene.Net.Analysis.TokenStream TokenStream(string fieldName, System.IO.TextReader reader)
{
var start = base.TokenStream(fieldName, reader);
HtmlStripCharFilter filter = new HtmlStripCharFilter(reader);
TokenStream result = new StandardFilter(filter);
return new StopFilter(new LowerCaseFilter(result), this.stopSet);
}
Run Code Online (Sandbox Code Playgroud)
并将 HtmlStripCharFilter 实现为:
public class HtmlStripCharFilter : Lucene.Net.Analysis.CharTokenizer
{
private bool inTag = false;
public HtmlStripCharFilter(TextReader input)
: base(input)
{
}
protected override bool IsTokenChar(char c)
{
if (c == '<' && inTag == false)
{
inTag = true;
return false;
}
if (c == '>' && inTag)
{
inTag = false;
return false;
}
return !inTag && !Char.IsWhiteSpace(c);
}
}
Run Code Online (Sandbox Code Playgroud)
它正朝着正确的方向前进,但在完成之前仍然需要做更多的工作。如果有人有更好的解决方案(阅读“经过测试的”解决方案),我很想听听。
| 归档时间: |
|
| 查看次数: |
1203 次 |
| 最近记录: |