突出显示solr搜索结果中的单词

时间:2012-03-20 06:04:54

标签: c# algorithm search solr

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

就像让我们说我正在搜索“加利福尼亚”然后我需要将加利福尼亚作为一个单词在结果网格中的任何地方找到。

如果我有一些像'CA 0012 *'的ID那么我需要突出显示CA,California,0012 * ..和CA 0012。

我想在C#4中编写这个逻辑。

提前致谢... :)

2 个答案:

答案 0 :(得分:2)

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

以下是该文件的一些相关摘录

  

<强> HL

     

设置为“true”启用突出显示的代码段

     

<强> hl.fl

     

以逗号或空格分隔的字段列表,为其生成突出显示的代码段

     

<强> hl.simple.pre / hl.simple.post

     

在突出显示的字词之前和之后出现的文字......

     

默认值为“&lt; em&gt;”和“&lt; / em&gt;”


您可能需要Solr的同义词或客户逻辑来识别CACalifornia。你还需要一个针对Solr的.Net绑定; SolrNet经常在这里讨论。

答案 1 :(得分:0)

我在java脚本中为我的Telerik Hierarchy网格编写了类似的逻辑。

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

然后我用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')")

当然,你必须自己编写一些逻辑来让CA取代加利福尼亚州。