2012-03-20 112 views
1

的搜索结果Higlight话我有其使用的solr作为搜索引擎,并显示在数据网格ASP.Net网站的搜索结果的应用程序。现在我需要在数据网格中部分或全部突出显示“搜索到的单词”。Solr中

就像让我们说我正在寻找“加利福尼亚州”然后我需要在加利福尼亚州的任何地方发现任何地方的高字号。

如果我有一些ID,如 'CA 0012 *' 然后,我需要强调CA,加利福尼亚州,0012 * ..和CA 0012也。

我想写这个逻辑在C#4

在此先感谢... :)

回答

2

您需要的荧光笔:http://wiki.apache.org/solr/HighlightingParameters

以下是该文件

一些相关的提取物

HL

设置为 “true” 使突出的片段......

hl.fl

领域要为其生成强调片段

HL的逗号或与空间分隔的列表。 simple.pre/hl.simple.post

这之前和亮词语后显示的文本...

的默认值是 “< EM>” 和 “</em>的”


您可能需要Solr的同义词或客户端逻辑,以确定CACalifornia。您还需要为Solr提供.Net绑定; SolrNet经常在这里讨论。

+1

设置'hl.fragsize = 0'以便返回整个值也是一个好主意 - 这样您就可以使用突出显示的值代替原始值。 – 2012-03-20 17:27:25

+1

请参阅 - http://code.google.com/p/solrnet/wiki/Highlighting了解如何使用SolrNet cleint使用突出显示。 SolrNet客户端附带的SampleApp也显示了使用突出显示的示例。 – 2012-03-21 00:13:34

0

我写了类似的逻辑,在Java脚本我Telerik的层次结构网格。

首先我加载找到的记录到网格(搜索服务器端)

然后我用下面的jQuery突出找到行。

的主要逻辑是创建一个动态SPAN周围找到的文本,并给它一个CSS类,显示其突出的变化的背景(或任何你想要的其他东西)。

以下是jQuery的

jQuery.fn.highlight = function(pat) 
{ 
function innerHighlight(node, pat) 
{ 
    var skip = 0; 
    if (node.nodeType == 3) 
    { 
     var pos = node.data.toUpperCase().indexOf(pat); 
     if (pos >= 0) 
     { 
     var spannode = document.createElement('span'); 
     spannode.className = 'highlight'; 
     var middlebit = node.splitText(pos); 
     var endbit = middlebit.splitText(pat.length); 
     var middleclone = middlebit.cloneNode(true); 
     spannode.appendChild(middleclone); 
     middlebit.parentNode.replaceChild(spannode, middlebit); 
     skip = 1; 
    } 
    } 
    else if (node.nodeType == 1 && node.childNodes && !/(script|style) /i.test(node.tagName)) { 
    for (var i = 0; i < node.childNodes.length; ++i) { 
    i += innerHighlight(node.childNodes[i], pat); 
    } 
    } 
    return skip; 
} 
return this.each(function() 
{ 
    innerHighlight(this, pat.toUpperCase()); 
}); 
}; 

如果你想获得其中包含您发现文中的所有行,你可以使用下面的jQuery

allrows = $.map("tr.rbi:contains('California')") 

当然,你必须写一些逻辑你自己去加利福尼亚州的加利福尼亚州。