将两个方面视为相同的值

时间:2013-03-15 13:41:47

标签: solr faceted-search

假设具有“作者”字段的书籍列表。如何在作者领域面对一个方面,但将“斯蒂芬金”和“理查德巴赫曼”的价值视为一样?所以这些结果:

  • 海明威:8
  • Stephen King:10
  • Edgar Allan Poe:20
  • Richard Bachman:5

将显示为:

  • 海明威:8
  • Stephen King:15
  • Edgar Allan Poe:20

请注意,如果小标题是“斯蒂芬金”,“理查德巴赫曼”或其他什么,那就不重要了。重要的是他们共同面对。

请注意,需要一个查询时解决方案。不幸的是,这个索引的模式无法更改,它是一个通用索引,如果每个用户都可以自己进行模式“调整”,那么它就会失控。

3 个答案:

答案 0 :(得分:3)

您可以通过将构面字段与构面查询相结合来实现这一目标。

将这些添加到您的查询中:

&facet=true
&facet.field=author
&facet.query=author:("Hemmingway" OR "Stephen King")

返回的Facets将如下所示:

facet_counts: {
    facet_queries: {
       "author:("Hemmingway" OR "Stephen King")" : 18
    }
    facet_fields: {
         author: {
            "Hemmingway"      : 8,
            "Stephen King"    : 10,
            "Edgar Allan Poe" : 20,
            "Richard Bachman" : 5
        }
    }
}

您还可以在构面查询中添加“别名”。改变这个

&facet.query=author:("Hemmingway" OR "Stephen King")

&facet.query={!ex=dt key="Hemmingway"}author:("Hemmingway" OR "Stephen King")

facet查询输出将是:

    facet_queries: {
       "Hemmingway" : 18
    }

我不确定你是否可以从Solr合并两个输出字段(facet_queries和facet_fields),但是从任何客户端执行此操作应该是直截了当的。

答案 1 :(得分:1)

您需要一个转换字符串的分析链。我认为如果您在查询时在索引时应用它,SynonymFilter将为您执行此操作。您需要确保sysnonym映射只有一种方式。

答案 2 :(得分:1)

我假设你不需要整个清单,只有前n位作者。如果是这种情况,您可以在后处理步骤中执行此操作。

你知道你的同义词,如果你稍微高一点facet.limit(比如2 * n)那么你只需要从结果集中过滤出同义词。如果你最终得到< n结果然后重复上一步(更糟糕的是,你必须再做一个请求,具体取决于同义词的数量)。

在ex ... &facet=true&facet.field=author&facet.limit=100&facet.mincount=1

这个与Solr无关,但考虑到它可能会削减它的所有限制。

致以最诚挚的问候,