假设我在 solr 数据库中有一堆不同类别的记录:产品、页面等。有没有办法获得计数,以便我可以显示类别中的匹配总数与总数。
类似于:
You searched for "breakfast"
Pages matching breakfast: 37/500 Products matching breakfast: 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。
最佳答案
给出
Schema(3 个字段,均为字符串类型 (solr.StrField)):
- 编号
- 标题
- 类别
输入数据:
- 4 个类别 - 产品、页面、帖子、其他
- 4 个标题 - 早餐、午餐、晚餐、晚餐
索引:
- 1000 个随机标题/类别的文档
请求
我们可以使用faceting为了计算特定结果:
搜索查询(搜索所有文档):
q=*:*
过滤查询(过滤特定的输入请求并用标签标记):
&fq={!tag=dt}title:breakfast
分面:
开启分面
&facet=true
如果只需要类别信息,则关闭结果
&rows=0
获取匹配计数
&facet.field=category
获取总计数(每个类别的计数,不包括提供的 filterQuery)
&facet.field={!ex=dt key=total_category}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}category
Result
Here a sample response which also contains the request:
<?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 - 类别中的文档总数
- 类别 - 类别中与过滤查询匹配的文档数
- name facet - 类别名称
奖励:
- 标题中早餐的总匹配项 - 所有类别中的 262
关于Solr 按类别计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19733827/