10

我在框架查询中使用 OR 逻辑运算符时遇到了这些问题。我不想增加 maxBooleanClause 值。除了这个还有其他选择吗。我的 OR 范围可以达到 200 万。我宁愿希望超过 maxBooleanClause 的范围,而不是 solr 拆分查询,最后合并所有子查询。这类事情可能吗?或者,如果你们中的任何人可以建议一些更好的技术来做到这一点。

我想绘制一个图表,其中用户提供了一些日期范围,例如 2013-03-01 到 2013-06-01 之间的所有访问者都可以访问该应用程序。在这里,我想进行一个查询,它是所有唯一 ID 的 OR。例如

      uniqueId:(1001 OR 1003 OR 1009 OR ........ OR 102467)

帮助表示赞赏。

4

2 回答 2

11

Solr 强加了一个maxBooleanClause正是因为这是超出其最佳位置的那种东西。最终,如果您需要数百万次搜索,那么您将需要在 Solr 之外进行自己的分发和聚合。

我要冒昧地猜测这些子句与图形相关,这是我看到这类查询的最常见的地方。在这种情况下,您可能会在某种程度上停留在 Solr 的优势范围内。

有时反转过滤器的逻辑是有意义的,而不是传递大量值作为过滤依据,而是将这些值索引到您正在搜索的文档中,以便稍后传递单个值。

例如,假设您有一个人员索引。并假设您想搜索与某个特定人成为朋友的人。您可以生成他们所有朋友的 ID 列表以过滤您的搜索。但是,您将遇到与您在此处看到的类似的问题:大量的 OR 子句。

或者,您可以将每个人的朋友列表索引到 Solr。现在您将拥有一个包含数千个值的字段,但您的查询过滤器将只有一个值:您过滤搜索所依据的网络的人员的 ID。

就搜索机制而言,这更符合 Solr 的优势。但是,这是有代价的。您需要自己管理非规范化,并且可能对文档进行大量更新,或者在更新图表时遇到一些延迟。

如果这被证明过于繁琐,您可能需要考虑一种更好地优化图遍历的不同技术。

于 2013-06-03T17:51:35.093 回答
3

您还可以使用更合适的查询解析器,例如 TermQueryParser,它更擅长处理大量 OR 子句。

例子:

{!terms f=uniqueId}1000,1001,10002,10003

默认分隔符是“,”因此所有正在搜索的术语都可以提供为 term1、term2、term3 等。

更多细节在这里:https ://cwiki.apache.org/confluence/display/solr/Other+Parsers#OtherParsers-TermsQueryParser

于 2017-02-01T07:06:16.857 回答