3

我们需要的与这里讨论的类似,除了不是作为过滤器而是作为实际查询: http: //lucene.472066.n3.nabble.com/filter-query-from-external-list-of-Solr-唯一 IDs-td1709060.html

我们想实现一个查询解析器/评分器,它允许我们将 SOLR 搜索与搜索外部字段结合起来。这是由于即使只需要更新文档中的一个字段,也必须更新整个文档的限制。

例如,我们有一个名为 document_attributes 的数据库表,其中包含两列 document_id、attribute_id。document_id 对应被索引的文档的 ID 是 SOLR。

我们希望能够传入如下查询:

attribute_id:123 OR text:some_query (attribute_id:123 OR attribute_id:456) AND text:some_query 等...

我们能否在 SOLR 中实现一个插件/模块,它能够解析上述查询,然后获取与 attribute_id 关联的 document_id,并将结果与​​ SOLR 搜索的正常处理相结合,以返回整个查询的一组结果。

如果可能的话,我们将不胜感激有关如何实现这一点的任何指导。

4

1 回答 1

1

我会重复引用问题提供的建议,并附有条件。

对于 Solr < 4.0,需要考虑的两种方法是:

  • 在查询 solr 之前进行 DocumentID 查找,并使用文档 ID 列表查询 solr(例如fq=(docid:1 OR docid:5)

  • 创建您自己的派生SolrQueryParser,它执行数据库查询以用文档 id 替换属性 id(eqfq=attribute:1由 queryparser 扩展为fq=(docid:1 OR docid:5)

该决定应围绕您将发送给 Solr 的文档 ID 的数量。对于小型或事件中等(比如说数百个)文档 ID,然后将 ID 作为 filterQuery 发送可能是最好的方法。如果您可能发送大量或非常大量的 documentid,那么为您的案例扩展查询解析器是一种公平的策略。如果您扩展查询解析器,您可能需要考虑在专用(非默认)请求处理程序上运行它,并在缓存等方面进行构建以确保您的结果保持高性能。

对于 Solr 4.0 及更高版本,您还可以考虑使用cross-core join。您可以让现有的 Solr 核心保持原样,并创建一个新的核心来索引文档:属性关系。这应该可以减轻您对整个文档更新的担忧,并允许您在内存中的 Solr 中执行整个查询。

于 2013-08-26T17:26:41.847 回答