【问题标题】:Solr - how to return most frequent terms of a querySolr - 如何返回查询的最常见术语
【发布时间】:2015-01-09 09:07:48
【问题描述】:

在执行查询 name:*b* AND country:China(名称包含“b”)时,我希望 solr 返回每个不同术语的人数(来自中国)

Documents(name are whitespace delimiter toknized):
[ 
{name: 'sponge bob'},
{name: 'billy chen'},
{name: 'abie white'}
]

预期结果

[
{term: 'bob', matches: 100},
{term: 'billy', matches: 90},
{term: 'abie', matches: 80}
]

尝试:构面搜索

我尝试像q=name:*b*+%3AAND+%3Acountry:China&facet=on&facet.field=name这样的查询

结果包括不相关的术语

[sponge,1, bob, 1, ...]

我怎样才能使用不相关的术语,例如 sponge

【问题讨论】:

  • 为什么 abie 虽然个子矮,但得分却比 billy 低?您的查询并不意味着您有兴趣以 b 开头?
  • @Yann 匹配的不是分数,而是有多少名为“abie”的人
  • 只对名称进行搜索,对名称进行分面并不能达到您想要的效果?
  • @Yann 我会更新问题以明确说明
  • 知道了 - 如果您创建另一个字段,它应该可以工作,内容与名称相同,但没有标记化(只需将其存储为字符串)。然后使用这个新字段作为你的分面字段。

标签: solr lucene solr4


【解决方案1】:

我不确定我是否正确理解了您的用例,但TermsComponent 可能适合您的需求。

它“提供对字段中的索引术语以及与每个术语匹配的文档数量的访问”(来自文档)。

在 solrconfig.xml 中配置组件后,查询应如下所示:

terms=true&terms.fl=name&terms.regex=.*b.*

【讨论】:

  • TermsComponent 不能返回特定查询的词频,我认为
  • 抱歉查询不清楚,我已经更新了我的查询。
  • 你是对的,但刻面也不是。两者都返回文档频率,即包含该术语的文档数量。有关条款组件的示例响应,请参阅wiki.apache.org/solr/TermsComponent#Specifying_Lower_Bound。除非您有包含“peter peter”或其他内容的文件,否则我相信这不会打扰您。
  • 其实facet.prefix可以过滤以前缀开头的词条,但是我找的是facet.regex或者facet.contains
  • 但是 TermsComponent 能够做到这一点:terms.regex=.*b.*,请参阅我的回答中的查询。
【解决方案2】:

最后我基于这个补丁https://issues.apache.org/jira/browse/SOLR-1387修改了facet search实现,给自己构建了一个全新的solr war

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    相关资源
    最近更新 更多