solr过滤器查询文档值

时间:2017-03-23 22:56:39

标签: solr

我正在寻找一个解决方案,我的很长的查询字符串返回414 http响应。有些查询可以达到10,000个字符,我可以看看改变了apache / jetty允许的字符数,但我宁愿不允许我的网络服务器让任何人发布10,000个字符。

在solr中是否有办法在文档中保存大型查询字符串并在过滤后的查询中使用它?

select?q=*:*&fq=id:123 - 这会返回一个完整的文档,但有没有办法在查询中返回文档123中字段的值

包含queryValue id的文档中的字段123将为Intersects((LONGSTRING))

有没有办法做select?q=*:*&fq=foo:{id:123.queryValue}

之类的事情

这与select?q=*:*&fq=foo:Intersects((LONGSTRING))相同?

2 个答案:

答案 0 :(得分:1)

两种可能性:

<强>加入

您可以使用Join查询解析器从一个集合/核心获取结果,并使用它来过滤不同核心的结果,但是当您谈论更大的安装和数据大小时,有一些限制将是相关的。您必须尝试查看这是否适用于您的用例。

The Join Query Parser

<强>散列

只要您只进行完全匹配,在索引和查询时在客户端散列字符串。具体如何执行此操作取决于您选择的语言。对于python,您将使用hashlib获取长字符串的哈希值,并使用sha256,您将获得一个结果字符串,您可以使用它来索引和查询64字节,如果你是如果您使用的是base64,请使用十六进制表格。

示例:

>>> import hashlib
>>> hashlib.sha256(b"long_query_string_here").hexdigest()
'19c9288c069c47667e2b33767c3973aefde5a2b52d477e183bb54b9330253f1e'

然后,您将在Solr中存储19c92...值,并在您查询之后获得相同的转换。

fq=hashed_id:19c9288c069c47667e2b33767c3973aefde5a2b52d477e183bb54b9330253f1e

答案 1 :(得分:1)

在您寻求的文字解决方案之前,可能有其他方法可以解决您的问题:

  1. 您可以将查询POST到Solr而不是使用GET。该
  2. 没有网址限制
  3. 如果您要发送一长串ID并使用OR构造,则可以使用其他查询解析器来提高效率(例如TermsQueryParser
  4. 如果您有常量(或半常量)查询参数,则可以将它们分解为请求处理程序的默认值(在solrconfig.xml中)。您可以根据需要创建任意数量的请求处理程序,并且可以覆盖默认值,因此这有效地允许您预定义查询的类/类型