【问题标题】:Highlighting in SolrNetSolrNet 中的高亮显示
【发布时间】:2013-12-04 12:38:29
【问题描述】:

我在突出显示工作时遇到问题。我使用带有 WCF 服务的 ASP.Net MVC 应用程序。 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;
    }

@ Line foreach (var h in results.Highlights[results[0].Id]) 我在浏览器中收到错误The given key was not present in the dictionary. 我不知道怎么了。

我的 schema.xml:

    <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> 
    <field name="content" type="text_general" indexed="true" stored="true" multiValued="true" termVectors="true" termPositions="true" termOffsets="true"/>
    <field name="author" type="text_general" indexed="true" stored="true" termVectors="true" termPositions="true" termOffsets="true"/>
    <field name="_version_" type="long" indexed="true" stored="true"/>
    <field name="search_snippet" type="text_general" indexed="true" stored="true" termVectors="true" termPositions="true" termOffsets="true" />

我的 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; }
    }
}

我的 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>

【问题讨论】:

    标签: c# asp.net-mvc solr highlighting solrnet


    【解决方案1】:

    您可能根本没有得到任何突出显示结果。您能否调试您的代码并验证是否填充了 results.Highlights。还要检查您的突出显示默认设置,因为我认为您需要设置 hl=true 不打开。

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

    【讨论】:

    • trueon 我认为是一样的。我得到了结果,但在结果中。突出显示只是存储的键,sn-ps 是空的。
    • 我在 foreach 的那行代码中遇到错误(结果中的 var h.Highlights[results[0].Id])=> 字典中不存在给定的键。
    • 您是否已验证直接针对 Solr 的同一查询是否返回了突出显示的结果?因为,通过在 SolrNet QueryOptions 中设置 HighlightingParameters,您只会返回/请求“search_sn-p”字段的突出显示。因为它是在查询中传递的,所以它会覆盖 solrconfig.xml 中的设置。如果您还需要其他字段的 sn-ps,请将它们添加到代码中的 Fields HighlightingParameters。
    • 我已经执行了 var results = solr.Query(new SolrQueryByField("author", searchString));现在我在结果中得到了 Sippets。亮点。所以我用一些错误的值覆盖了正确的 HighlightingParameters 。但我不知道问题出在哪里?我想使用 SolrNet 参数来处理我的查询!
    • 听起来您的问题是您的查询要么没有找到任何匹配的结果,要么返回的查询结果没有任何亮点,这很有可能。只要您传递了您希望与 SolrNet 一起使用的参数,您应该不会有任何问题,因为查询传递的参数将始终覆盖 solrconfig.xml 中的任何默认设置。
    【解决方案2】:

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

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

    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[] { "*" },
                }
            });
    

    所以我得到了所有结果的所有 sn-ps。感谢您的帮助!!!!

    【讨论】:

    • 是的,这就是我在原始答案的第一条评论中所说的。您需要指定所有需要 sn-ps 的字段。我不确定使用“*”是最好的方法。尝试使用 { "search_snippet", "author", "content" } 来匹配您的 solrconfig.xml 设置。
    【解决方案3】:

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

    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(2013 年 10 月 16 日 00:32)

    【讨论】:

      猜你喜欢
      • 2011-12-13
      • 2011-07-06
      • 1970-01-01
      • 1970-01-01
      • 2012-03-11
      • 1970-01-01
      • 2014-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多