【问题标题】:SolrNet facetted searchSolrNet 分面搜索
【发布时间】:2013-07-27 17:58:41
【问题描述】:

我是第一次使用 Solr 和 Solrnet。

我已经设法创建了一个架构,其中包含以下字段:

created_date DateTime
parent_id int
categories string multi-valued

我已经能够针对parent_id 字段进行基本搜索,如下所示:

var solr = ServiceLocator.Current.GetInstance<ISolrOperations<SolrNode>>();
            ICollection<SolrNode> results = solr.Query(new SolrQueryByField("parent_id", currentNode.Id.ToString()));

我已经能够弄清楚(某种程度上)如何为我的所有结果返回构面,如下所示:

var solrFacet = ServiceLocator.Current.GetInstance<ISolrOperations<SolrNode>>();
            var r = solrFacet.Query(SolrQuery.All, new QueryOptions
            {
                Rows = 0,
                Facet = new FacetParameters
                {
                    Queries = new[] { 
                        //new SolrFacetDateQuery("created_date", DateTime.Now /* range start */, DateTime.Now.AddMonths(-6) /* range end */, "+1DAY" /* gap */) {
                        //    HardEnd = true,
                        //    Other = new[] {FacetDateOther.After, FacetDateOther.Before}
                        //}
                        new SolrFacetDateQuery("created_date", new DateTime(2011, 1, 1).AddDays(-1) /* range start */, new DateTime(2014, 1, 1).AddMonths(1) /* range end */, "+1MONTH" /* gap */) {
                            HardEnd = true,
                            Other = new[] {FacetDateOther.After, FacetDateOther.Before}
                        }
                        //,
                        //new SolrFacetFieldQuery("categories")
                    }, 
                }
            });
            //foreach (var facet in r.FacetFields["categories"])
            //{
            //    this.DebugLiteral.Text += string.Format("{0}: {1}{2}", facet.Key, facet.Value, "<br />");
            //}

            DateFacetingResult dateFacetResult = r.FacetDates["created_date"];
            foreach (KeyValuePair<DateTime, int> dr in dateFacetResult.DateResults)
            {
                this.DebugLiteral.Text += string.Format("{0}: {1}{2}", dr.Key, dr.Value, "<br />");
            }

但我无法弄清楚如何将它们全部组合在一起。我的要求如下:

页面加载 - 显示 parent_id 与 N 匹配的所有搜索结果。查询搜索结果的构面并显示构面的复选框,如下所示:

类别

  • 1 类
  • 2 类

  • 上周
  • 上个月
  • 最近 3 个月
  • 过去 6 个月
  • 所有时间

用户点击相关复选框,然后代码执行另一个 solr 查询,同时传入 parent_id 条件以及用户选择的方面。

我意识到在我的描述中我已经简化了这个过程,也许在 StackOverflow 上问这个问题是一个很大的问题,所以我当然不期待一个可行的例子(尽管如果你感到无聊,请随意;- )) 但任何人都可以提供任何指针或示例吗? SolrNet 确实有一个 MVC 示例应用程序,但我正在使用 WebForms 并且对 MVC 还不是特别满意。

任何帮助将不胜感激。

提前致谢 铝

【问题讨论】:

    标签: c# solr solrnet


    【解决方案1】:

    您可以加入查询并将分面添加为查询操作

    ISolrQueryResults<TestDocument> r = solr.Query("product_id:XXXXX", new QueryOptions {
        FacetQueries = new ISolrFacetQuery[] {
            new SolrFacetFieldQuery("category")
        }
    });
    

    【讨论】:

      【解决方案2】:

      我创建了一个包含所选构面的“fq”字符串。例如,如果用户选择这些方面:

       united states
      
       california
      
       almond growers
      

      而 facet 字段是 'content_type',我生成这个查询字符串:

      (content_type:"united states" AND content_type:california  AND content_type:"almond growers")
      

      注意引号和左括号和右括号...很重要!我将它存储在名为 finalFacet 的变量中。然后我像这样将它提交给 Solr,其中 sQuery 是用户正在搜索的文本,而 finalFacet 是上面所示的构面查询字符串:

      articles = solr.Query(sQuery, new QueryOptions
      {
         ExtraParams = new Dictionary<string, string> {
         {"fq", finalFacet},
      },
      Facet = new FacetParameters
      {
         Queries = new[] { new SolrFacetFieldQuery("content_type")}
      },
      Rows = 10
      Start = 1,
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多