3

假设我在 solr 数据库中有一堆不同类别的记录:产品、页面等。有没有办法获得计数,这样我就可以显示类别中的总匹配数与总数。

就像是:

您搜索的是“早餐”

匹配早餐的页数:37 /500 匹配早餐的产品:7 /100

等等。

如果我能以某种我可以循环的结构得到这个,那么加分,这个伪代码:

print "You searched for %s\n" % term
for category, match_count, total_count in categories:
    print "%ss matching %s: %d/%d\n" % (category, match_count, total_count)

这与语言无关,我计划使用 GET 请求直接访问 solr 索引,而不是使用任何 API。

4

1 回答 1

6

给定

架构(3 个字段,所有类型的字符串(solr.StrField)):

  • ID
  • 标题
  • 类别

输入数据

  • 4 个类别 - 产品、页面、帖子、其他
  • 4 个标题 - 早餐、午餐、晚餐、晚餐

索引

  • 1000 个随机标题/类别的文档

要求

我们可以使用faceting来计算特定结果:

  • 搜索查询(搜索所有文档):

    q=*:*

  • 过滤查询(过滤特定的输入请求并用标签标记):

    &fq={!tag=dt}title:早餐

  • 刻面:

    • 打开分面

      &方面=真

    • 如果只需要类别信息,请关闭结果

      &rows=0

    • 获取匹配计数

      &facet.field=类别

    • 获取总计数(每个类别的计数,不包括提供的 filterQuery)

      &facet.field={!ex=dt key=total_category}类别

最终查询将是这样的:

http://localhost:8983/solr/stack19733827/select?q=*%3A*&fq=%7B!tag%3Ddt%7Dtitle%3Abreakfast&rows=0&wt=xml&indent=true&facet=true&facet.field=category&facet.field={!ex =dt%20key=total_category}类别

结果

这是一个包含请求的示例响应:

<?xml version="1.0" encoding="UTF-8"?>
<response>

<lst name="responseHeader">
  <int name="status">0</int>
  <int name="QTime">1</int>
  <lst name="params">
    <str name="q">*:*</str>
    <arr name="facet.field">
      <str>category</str>
      <str>{!ex=dt key=total_category}category</str>
    </arr>
    <str name="indent">true</str>
    <str name="fq">{!tag=dt}title:breakfast</str>
    <str name="rows">0</str>
    <str name="wt">xml</str>
    <str name="facet">true</str>
    <str name="_">1383337530565</str>
  </lst>
</lst>
<result name="response" numFound="262" start="0">
</result>
<lst name="facet_counts">
  <lst name="facet_queries"/>
  <lst name="facet_fields">
    <lst name="category">
      <int name="other">75</int>
      <int name="page">65</int>
      <int name="product">62</int>
      <int name="post">60</int>
    </lst>
    <lst name="total_category">
      <int name="other">260</int>
      <int name="product">253</int>
      <int name="page">250</int>
      <int name="post">237</int>
    </lst>
  </lst>
  <lst name="facet_dates"/>
  <lst name="facet_ranges"/>
</lst>
</response>

它包含方面所需的信息:

  • total_category - 类别中的文档总数
  • 类别- 类别中与过滤器查询匹配的文档数
  • 方面的名称- 类别的名称

奖金:

  • 标题中早餐的总匹配 - 所有类别中的 262
于 2013-11-01T20:46:13.057 回答