5

想象一个像下面这样的索引:

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

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

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


按字段名称过滤(2)
描述(1)

当用户对“description”字段应用过滤器时,只会返回“description”字段中包含“Apple”一词的文档。所以第二个请求的结果集将只是 iPod 文档。为此,我会使用类似的查询?q=Apple&qf=description(我正在使用Extended DisMax Query Parser

我怎样才能用 Solr 做到这一点?

我已经尝试过分面、分组和突出显示组件,但并没有真正找到合适的解决方案。


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

4

5 回答 5

1

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

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

2)您可以过滤查询每次在末尾动态添加“fq”参数

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

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

因为我说“你有 2 个选项”,但你实际上有 3 个(我急忙回答),这里是第三个:

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

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 ......不要问我为什么...)

于 2012-12-19T11:55:36.503 回答
1

Solr 只是简单地不这样做。如果你绝对需要它,我会尝试使用多请求解决方案并对其进行基准测试——solr 往往比人们放在它前面的要快得多,所以几个请求可能没什么大不了的。

于 2012-12-19T11:56:10.137 回答
1

您可以通过两个不同的搜索请求/查询来实现这一点:

名称:苹果-> 2 次点击

描述:苹果-> 1 次命中

编辑:

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

于 2012-12-19T09:36:50.890 回答
0

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

于 2012-12-19T09:54:52.733 回答
0

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

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

查找包含donkeytitletext字段中的文档数。我可能会得到这样的回应:

{
 "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
于 2013-10-10T02:59:50.940 回答