8

我使用 SOLR 来存储包含一些由多个值组成的元数据的文档。通常是带有标签的 id。一个简单的示例是一个城市的名称和该城市的唯一 ID。id 是必需的,因为不同的城市可以使用相同的名称,例如德国的柏林和美国的柏林。显然需要该名称,因为我想搜索该字符串。

如果我使用构面,我想取回带有“柏林”标签的两个构面。如果我将搜索(使用其他一些元数据字段)限制为来自德国的文档,我希望只获得德国柏林的一个方面。如果我将 id 和 label 存储在两个单独的 SOLR 字段中,显然这不起作用。

我认为这不是一个不常见的要求,但我找不到任何有用的信息。我目前的做法是:

  • 在 Java 中实现一个完整的自定义字段类型:对我来说很难估计,因为我目前只是 SOLR 用户,而不是 SOLR 开发人员。

  • 将 id 和 label 放在单个字符串中(如“123:Berlin”和“456:Berlin”),并使用拆分值的自定义分析器在 schema.xml 中定义自定义字段类型。对我来说听起来很合理,但我不能 100% 确定它是否适用于刻面。

  • 我发现了一些对子字段的引用,但仅在旧页面上,我无法找到有用的文档。

在 SOLR 中是否有一些众所周知的方法来解决这个问题?

4

4 回答 4

3

枢轴刻面可以工作。

假设您有以下字段:cityId, cityName, country

使用查询参数对 city-id、city-name 进行数据透视:

facet.pivot=cityId,cityName

在第一级,就像标准方面一样,您将获得每个城市 ID。但在第二层,您将获得每个城市的名称。假设每个城市 ID 只有一个名称,您可以简单地从下一个方面级别(在pivotXML 中的元素下)读取每个城市 ID 的名称。

<lst name="facet_pivot">
    <arr name="cityId,city">
        <lst>
            <str name="field">cityId</str>
            <str name="value">1</str>
            <int name="count">1</int>
            <arr name="pivot">
                <lst>
                    <str name="field">city</str>
                    <str name="value">berlin</str>
                    <int name="count">1</int>
                </lst>
            </arr>
        </lst>
        <lst>
            <str name="field">cityId</str>
            <str name="value">2</str>
            <int name="count">1</int>
            <arr name="pivot">
                <lst>
                    <str name="field">city</str>
                    <str name="value">berlin</str>
                    <int name="count">1</int>
                </lst>
            </arr>
        </lst>
        <lst>
            <str name="field">cityId</str>
            <str name="value">3</str>
            <int name="count">1</int>
            <arr name="pivot">
                <lst>
                    <str name="field">city</str>
                    <str name="value">melbourne</str>
                    <int name="count">1</int>
                </lst>
            </arr>
        </lst>
    </arr>
</lst>

基本上,如果 ID 是唯一的,那么您将保证pivot在第二级只有一个值。

或者,如果您想将您的“柏林”组合在一起,只需颠倒刻面枢轴的顺序并使其:

facet.pivot=cityName,cityId

并且您将在第一级获得“柏林”,在第二级可能会获得多个 ID(作为奖励,您可以添加第三级country,以便您可以在第三级之外读取每个城市的国家/地区)。

于 2013-05-23T06:30:16.237 回答
1

似乎没有开箱即用的解决方案。

  1. 您的 #2 应该可以与一些客户端修改正常工作。
  2. 您可以使用 id_name 作为单个字符串字段来索引您的数据。需要在索引时更改。如果您使用的是 DIH,则使用 Transformers 会更容易。
  3. 现在,您将为每个 id 拥有唯一的 facets,并且在客户端,您始终可以拆分 Facets 以进行显示。

您还可以检查 Facet Pivots,它可以提供Hierarchical Faceting

于 2013-05-21T05:10:32.603 回答
0

一个相当简单的建议:在索引时使用两个字段,直到copyField“123:柏林”之类的值

一个notindexedstored字符串字段,用于在客户端进行分面加解析/清理和搜索使用副本indexed,而不是stored在 ex: 中使用简单的正则表达式分析器PatternReplaceCharFilterFactory

不需要自定义分析器或新类型的字段,就像您在第二个解决方案中已经指出的那样

于 2013-05-28T14:45:29.543 回答
0

那应该行得通。如果您添加过滤器查询,例如fq=country_name:Germany,它应该只返回德国城市的构面。请看下面的这个例子:

假设您的架构中有 4 个字段:

id、city_name、country_name、state_name

样本数据:

编号: 1

城市名称:柏林

国家名称:德国

state_name: Some_State1


编号: 2

城市名称:柏林

国家名称:美国

state_name: Some_State2


编号: 3

城市名称:都柏林

国家名称:爱尔兰

state_name: Some_State3


编号: 4

城市名称:都柏林

国家名称:美国

state_name:加利福尼亚


编号: 5

城市名称:都柏林

国家名称:美国

state_name:弗吉尼亚州


如果您想了解所有名称为都柏林的城市:

/select/?q=*:*&facet=true&facet.field=country_name&facet.field=city_name&fq=city_name:Dublin

结果,都柏林刻面的计数将为 3


现在,如果您想获取名称为 Dublin 的所有城市的 facet 并将国家/地区限制为 USA,您的查询将是:

/select/?q=*:*&facet=true&facet.field=country_name&facet.field=city_name&fq=city_name:Dublin&fq=country_name:USA

结果,Facet Dublin 的计数将是 2,因为我们在美国有两个都柏林,一个在加利福尼亚,另一个在弗吉尼亚

注意:我添加了&fq=country_name:USA

于 2013-05-21T00:46:05.590 回答