C# 在SolrNet中突出显示

C# 在SolrNet中突出显示,c#,asp.net-mvc,solr,highlighting,solrnet,C#,Asp.net Mvc,Solr,Highlighting,Solrnet,我在工作上遇到了问题。我使用带有WCF服务的ASP.NETMVC应用程序。WCF服务将结果返回给视图。我的代码是: public IEnumerable<Dictionary<string, string>> SolrQuery(string searchString) { SolrInitialSetup(); var solr = ServiceLocator.Current.GetInstance<ISolrOper

我在工作上遇到了问题。我使用带有WCF服务的ASP.NETMVC应用程序。WCF服务将结果返回给视图。我的代码是:

public IEnumerable<Dictionary<string, string>> SolrQuery(string searchString)
    {
        SolrInitialSetup(); 

        var solr = ServiceLocator.Current.GetInstance<ISolrOperations<SolrPDFDocument>>();

        var results = solr.Query(new SolrQueryByField("author", searchString),
            new QueryOptions
            {
                Highlight = new HighlightingParameters
                {
                    Fields = new[] { "search_snippet" },
                }
            });

        var returnedResults = new List<Dictionary<string, string>>();

        if (results.Count > 0)
        {
            foreach (var pdfDoc in results)
            {
                var docBuffer = new Dictionary<string, string>();
                docBuffer.Add("Id", ""+pdfDoc.Id.GetHashCode());
                docBuffer.Add("Content", "" + pdfDoc.Content.ElementAt(0));
                docBuffer.Add("Version", "" + pdfDoc.Version);

                foreach (var h in results.Highlights[results[0].Id])
                {
                    docBuffer.Add("search_snippet", String.Format("{0}", string.Join(", ", h.Value.ToArray())));
                    Debug.WriteLine("search_snippet", String.Format("{0}", string.Join(", ", h.Value.ToArray())));
                }
                returnedResults.Add(docBuffer);
            }
        }
        return returnedResults;
    }
我的SolrPDFDocument.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SolrNet.Attributes;

namespace WcfSearchService
{
    class SolrPDFDocument
    {
        [SolrUniqueKey("id")]
        public string Id { get; set; }

        [SolrField("author")]
        public string Author { get; set; }

        [SolrField("content")]
        public ICollection<string> Content { get; set; }

        [SolrField("search_snippet")]
        public ICollection<string> SearchSnippet { get; set; }

        [SolrField("_version_")]
        public long Version { get; set; }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用SolrNet.Attributes;
命名空间WcfSearchService
{
类SolrPDFDocument
{
[SolrUniqueKey(“id”)]
公共字符串Id{get;set;}
[索尔菲尔德(“作者”)]
公共字符串作者{get;set;}
[索尔菲尔德(“内容”)]
公共ICollection内容{get;set;}
[索尔菲尔德(“搜索片段”)]
公共ICollection搜索代码段{get;set;}
[SolrField(“\u版本”)]
公共长版本{get;set;}
}
}
My solrconfig.xml

<requestHandler name="/select" class="solr.SearchHandler">
    <!-- default values for query parameters can be specified, these
         will be overridden by parameters in the request
      -->
     <lst name="defaults">
       <str name="echoParams">explicit</str>
       <int name="rows">10</int>
       <str name="df">text</str>

     <!-- Highlighting defaults -->
       <str name="hl">on</str>
       <str name="hl.fl">search_snippet author content</str>
     </lst>
</requestHandler>

明确的
10
文本
在…上
搜索代码段作者内容

您可能根本得不到任何突出显示结果。您能否调试代码并验证是否填充了
结果。突出显示。同时检查突出显示默认设置,因为我认为您需要将hl=true not设置为on

 <str name="hl">true</str>
true

好的,我已经解决了我的问题

而不是像这样使用示例代码:

var results = solr.Query(new SolrQueryByField("author", searchString),
        new QueryOptions
        {
            Highlight = new HighlightingParameters
            {
                Fields = new[] { "author" },
            }
        });
我将新字段的参数设置为:

var results = solr.Query(new SolrQueryByField("text", searchString),
        new QueryOptions
        {
            Highlight = new HighlightingParameters
            {
                Fields = new[] { "*" },
            }
        });

所以我把所有的片段都放到了所有的结果中。谢谢你的帮助

这很有趣。对我来说,这不起作用(我没有得到任何结果):

但是,这对我来说很有用:

 var results = solr.Query(string.Format("{0}:{1}", "text", searchString),
            new QueryOptions
            {
                Highlight = new HighlightingParameters
                {
                    Fields = new[] { "*" },
                }
            });

我使用的是solr 4.6.0和SolrNet build#173(10月16日13:32)

我认为正确和正确是一样的。我得到结果,但在结果中。高亮显示只是存储的键,而代码段是空的。我在foreach的代码行(results.hights[results[0].Id])=>给定的键在字典中不存在。您是否验证了直接针对Solr的同一查询是否返回高亮显示结果?因为,通过在SolrNet查询选项中设置HighlightingParameters,您只返回/请求“搜索片段”字段的高亮显示。因为它是在查询中传递的,所以它将覆盖solrconfig.xml中的设置。如果还需要其他字段的代码段,请将它们添加到代码中的字段HighlightingParameters中;现在我在结果中得到了Sippets.Highlights。所以我用一些错误的值覆盖了正确的HighlightingParameters。但我不知道问题是什么?我想使用SolrNet参数来处理我的查询!听起来您的问题可能是查询没有找到任何匹配的结果,或者返回的查询结果没有任何突出显示,这是很有可能的。只要传递希望与SolrNet一起使用的参数,就不会有任何问题,因为随查询传递的参数将始终覆盖solrconfig.xml中的任何默认设置。是的,这是我在原始答案的第一条注释中所说的。您需要指定要为其创建代码段的所有字段。我不确定使用“*”是最好的方法。尝试使用
{“search\u snippet”、“author”、“content”}
来匹配您的solrconfig.xml设置。
var results = solr.Query(new SolrQueryByField("text", searchString),
        new QueryOptions
        {
            Highlight = new HighlightingParameters
            {
                Fields = new[] { "*" },
            }
        });
 var results = solr.Query(string.Format("{0}:{1}", "text", searchString),
            new QueryOptions
            {
                Highlight = new HighlightingParameters
                {
                    Fields = new[] { "*" },
                }
            });