我设置了 Solr v9.5 服务,允许用户搜索最终用户内容的语料库。 我研究了三种实现自动建议的方法,这些方法向用户显示每个建议应该期望的结果数量。 各有各的缺点:
实现 A:在索引期间,我将可搜索字段收集到“建议”字段中,并调整
<requestHandler>
以从该字段返回值。 PRO: 返回与索引文档的实际集合极其相关的值。 CON: 为了获取将返回的结果数量,对于每个建议,我发出一个新的常规查询,并解析出 numFound
,在我可以显示任何建议之前添加了很多时间。
实现 B:Solr 有一个
Suggester
设施。 PRO: 特别适合自动建议。 CON: 文档中没有任何内容表明支持返回每个返回建议的结果计数。
实现 C:Solr 有一个
Terms Component
功能,用于获取与输入术语匹配的文档计数,它们声明并演示了这些文档可用于自动建议。 PRO: 这是最接近我想要的,在一次操作中返回匹配项和计数。 CON: 使用这些匹配的术语进行搜索查询时,计数与实际结果数不符。
实施 C 的更多详细信息:如果我提交此术语查询,其中
terms.fl
字段与常规用户搜索的 qf
字段匹配:...
http://localhost:8983/solr/my_core/terms?wt=json&terms.limit=-1&terms.regex.flag=case_insensitive&terms.fl=title_list&terms.fl=topic_list&terms.fl=summary&terms.fl=category_name_list&terms.fl=genre&terms.fl=skill_list&terms.fl=skill_type_list&terms.fl=search_terms&terms.fl=landing_page_keyword&terms.fl=language_name&terms.regex=.*canada.*
...我收到以下 Solr 响应:...
{
"responseHeader":{
"status":0,
"QTime":88},
"terms":{
"title_list":[
"canada",12],
"topic_list":[
"canada",52],
"summary":[
"canada",32,
"canada,",10,
"canada.",10],
"category_name_list":[],
"genre":[],
"skill_list":[],
"skill_type_list":[],
"search_terms":[
"canada",7,
"canada,",7],
"landing_page_keyword":[],
"language_name":[]}
}
问题是,如果我定期进行最终用户搜索“canada”,我会得到 71 个结果。 将上述回复中的文档计数总计为 130。(即使我不计算“加拿大”和“加拿大”的文档计数,我也有 103 个。)
我认为这种差异是因为,例如,给定的文档在标题和摘要中可能都有“加拿大”,因此被直接文档计数计算了两次,
Terms Component
确实如此。
那么,有没有办法让 Solr 返回自动建议术语以及每个建议术语的搜索结果的确切数量?
我对服务实现有很大的自由度,所以如果有一种方法可以做到这一点而不涉及上述任何内容、专门的配置等。我很愿意听到它。
谢谢你。
我的问题最终得到了“实现 A”。 我猜,增加的时间其实是微不足道的,主要是因为 Solr / Lucene 的速度有多快。
事实证明,在足够的时间用于生产使用的情况下,这已经足够了。 而且,如果它开始变得太慢,可以使用直接的缓存选项来缓存给定术语的结果计数:大多数用户的搜索都是针对相当有限的术语集,并且结果计数在几天或几周的时间范围内保持稳定。