【问题标题】:Higlight words in the search results of solr在 solr 的搜索结果中突出显示单词
【发布时间】:2012-03-20 06:04:54
【问题描述】:

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

就像让我们说我正在搜索“California”然后我需要在结果网格中的任何位置突出显示 california 作为单词。

如果我有一些 ID,例如“CA 0012*”,那么我需要突出显示 CA、California、0012*.. 和 CA 0012。

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

提前谢谢...:)

【问题讨论】:

    标签: c# algorithm search solr


    【解决方案1】:

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

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

    hl

    设置为“true”启用突出显示的 sn-ps...

    hl.fl

    要为其生成突出显示的 sn-ps 的 字段 的逗号或空格分隔列表

    hl.simple.pre/hl.simple.post

    突出显示的术语前后出现的文本...

    默认值为“”和“


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

    【讨论】:

    • 设置hl.fragsize=0 以便返回整个值可能也是一个好主意 - 这样您就可以使用突出显示的值代替原始值。
    • 请参阅 - code.google.com/p/solrnet/wiki/Highlighting 了解如何使用 SolrNet 客户端突出显示的详细信息。 SolrNet 客户端自带的 SampleApp 也展示了一个使用高亮的例子。
    【解决方案2】:

    我在 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 代替加利福尼亚。

    【讨论】:

      猜你喜欢
      • 2023-03-17
      • 2019-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-05
      • 2016-11-25
      • 1970-01-01
      相关资源
      最近更新 更多