【问题标题】:Solr associationsSolr 关联
【发布时间】:2011-02-10 23:25:43
【问题描述】:

最近几天我们正在考虑使用 Solr 作为我们选择的搜索引擎。 我们需要的大多数功能都是开箱即用的,或者可以轻松配置。 然而,我们绝对需要的一项功能似乎在 Solr 中被很好地隐藏(或缺失)了。

我会尝试用一个例子来解释。我们有很多实际上是企业的文件:

<document>
  <name>Apache</name>
  <cat>1</cat>
  ...
</document>
<document>
  <name>McDonalds</name>
  <cat>2</cat>
  ...
</document>

此外,我们还有另一个包含所有类别和同义词的 xml 文件:

<cat id=1>
  <name>software</name>
  <synonym>IT<synonym>
</cat>
<cat id=2>
  <name>fast food</name>
  <synonym>restaurant<synonym>
</cat>

我们希望将企业和类别关联起来,以便我们可以使用类别的名称和/或同义词进行搜索。但我们不想在索引时合并这些文件,因为我们应该更新类别(adding.remioving 同义词...),而无需再次索引所有业务。

Solr 中是否有任何东西可以进行这种关联,还是我们需要开发一些特定的部分?

欢迎所有反馈和建议。

提前致谢, 汤姆

【问题讨论】:

    标签: lucene search-engine solr


    【解决方案1】:

    基本上你在这里有一个设计决定。人们对 Solr 索引所做的通常的事情是对它们进行非规范化,即将类别定义分解到业务文档中。 由于您不想这样做,我建议保留两种类型的文档 - 一种用于企业,另一种用于类别。您可以将两者保存在同一个索引中,因为 Solr 并不要求所有文档都具有相同的字段。业务文档看起来很简单,但您必须使它们可以通过业务名称和类别 ID 进行搜索。我建议为每个同义词创建一个类别文档,您可以在其中按同义词搜索并找到 id(和类别名称)。

    要使用同义词进行搜索,您需要进行双重搜索 -

    • 使用名称文本搜索类别 ID。
    • 使用类别 ID 搜索企业。

    【讨论】:

      【解决方案2】:

      实际上有一个过滤器类叫做solr.SynonymFilterFactory

      这应该允许您将猫编号映射到其 2 个文本等效项,如果您仅在查询分析器中使用它,如下所示:

          <fieldType name="category" class="solr.TextField" positionIncrementGap="100">
        <analyzer type="index">
          <tokenizer class="solr.WhitespaceTokenizerFactory"/>
          <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
          <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
        <analyzer type="query">
          <tokenizer class="solr.WhitespaceTokenizerFactory"/>
          <filter class="solr.SynonymFilterFactory" synonyms="category_Synonyms.txt" ignoreCase="true" expand="false"/>
          <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
          <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
      </fieldType>
      

      这样您就可以只索引类别 ID。这意味着您不必再次将所有业务发送到 Solr。此外,如果有人查询“软件”或“IT”,它会将其映射到类别

      您的 category_Synonyms.txt 应包含如下行:

      1、软件、IT

      这里唯一的缺点是,当您更改名称或同义词时,您必须想出一种编辑文本文档的方法。所以我想这只会在您不经常更改类别名称时才有帮助?除非其他人知道可以轻松完成此操作的方法。

      我实际上将上述内容添加到我自己的 solr 中并在其上运行了 Analyser 工具。结果如下:

      如您所见,它已将软件变成了

      1

      请注意,您必须设置

      展开

      参数

      我希望这会有所帮助。

      戴夫

      【讨论】:

        【解决方案3】:

        您无法找到未编入索引的信息片段,除非您在提交查询之前实施某种查询翻译/扩展,将某些查询词翻译成索引等效项。

        因此,如果用户键入“restaurant”,那么您的查询将被转换为包含 cat=1 的过滤器。

        据我所知,Solr 不包含此功能,因此您必须自己实现它或调整合适的模块(如http://lucene-qe.sourceforge.net/)。

        【讨论】:

          【解决方案4】:

          除了前面提供的一些出色的想法外,您还可以查看多值字段。因此,您的类别字段可以包含任意数量的值(并在需要时更新),当您搜索它时会查询所有值。

          【讨论】:

            猜你喜欢
            • 2014-05-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多