Solr - 如何获取Solr中该字段中包含搜索词的每个字段的文档数?

时间:2012-12-19 09:01:17

标签: solr

想象一下如下的索引:

id   partno      name          description
1    1000.001    Apple iPod    iPod by Apple
2    1000.123    Apple iPhone  The iPhone

当用户搜索“Apple”时,将返回两个文件。现在,我想让用户通过将搜索范围限制在一个或多个字段中来缩小搜索结果的范围,这些字段在这些字段中包含术语“Apple”。

因此,理想情况下,用户在第一次查询后会在ui的过滤器部分看到类似的内容:

  

按字段过滤
  name(2)
  description(1)

当用户对字段“description”应用过滤器时,仅返回字段“description”中包含术语“Apple”的文档。因此,第二个请求的结果集只是iPod文档。为此我会使用像?q=Apple&qf=description这样的查询(我正在使用Extended DisMax Query Parser

如何使用Solr实现这一目标?

我已经尝试过分组,分组和突出显示组件,但实际上没有找到一个合适的解决方案。


[更新]
再说一遍:这里的主要问题是获取显示“按字段过滤”部分所需的信息。这包括字段的名称和每个字段的命中。使用其中一个过滤器发送第二个请求已经有效。

5 个答案:

答案 0 :(得分:1)

您可以使用两个不同的搜索请求/查询来实现此目的:

名称:苹果 - > 2次点击

说明:apple - > 1点击

编辑:

您还可以实现自己的SearchComponent在后​​台执行多个查询并将其放在SearchHandler处理链中,这样您只需要在前端进行一次查询。

答案 1 :(得分:1)

如果您希望每次都在相同的字段中搜索该字词,您有2个选项不会违反“单个查询”要求:

1)copyField:您在索引时将所有应与togheter匹配的字段分组。只有一个复制域你的问题不存在,如果你需要不止一个,你就在同一个地方。

2)您可以在每次动态添加"fq"参数时过滤查询

http://<your_url_and_stuff>/?q=Apple&fq=name:Apple ...

如果您将始终在相同的两个字段上搜索(或者您可以在查询之前设置它们),这是有效的,否则您将始终至少需要第二个查询

因为我说“你有两个选择”,但你实际上有3个(我赶紧回答),这是第三个:

3)他们描述的dismax plugin是这样的:

The DisMaxQParserPlugin is designed to process simple user entered phrases 
(without heavy syntax) and search for the individual words across several fields 
using different weighting (boosts) based on the significance of each field.

所以,如果你可以使用它,你可能想看看它并从qf参数开始(这是2号选项想要的,但我更改了它有利于fq ... don不问我为什么......)

答案 2 :(得分:1)

Solr just plain不这样做。如果你绝对需要它,我会尝试多个请求解决方案并对它进行基准测试 - solr往往比人们放在它前面的速度快得多,所以几个请求可能不是那么大的交易。

答案 3 :(得分:0)

SolrFaceting应该可以解决您的问题。 看看Examples

答案 4 :(得分:0)

这可以通过Solr faceting来实现,但它并不整洁。例如,我可以发出此查询:

/select?q=*:*&rows=0&facet=true&facet.query=title:donkey&facet.query=text:donkey&wt=json

查找donkeytitle字段中包含text的文档数量。我可能会得到这样的答复:

{
 "responseHeader":{"status":0,"QTime":1,"params":{"facet":"true","facet.query":["title:donkey","text:donkey"],"q":"*:*","wt":"json","rows":"0"}},
 "response":{"numFound":3365840,"start":0,"docs":[]},
 "facet_counts":{
  "facet_queries":{
   "title:donkey":127,
   "text:donkey":4108
  },
  "facet_fields":{},
  "facet_dates":{},
  "facet_ranges":{}
 }
}

由于您还希望将文档重新用于字段析取查询,因此类似以下内容:

/select?q=donkey&defType=edismax&qf=text+titlle&rows=10&facet=true&facet.query=title:donkey&facet.query=text:donkey&wt=json