【问题标题】:solr filter query on document valuesolr过滤器查询文档值
【发布时间】:2017-03-24 22:57:46
【问题描述】:

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

在 solr 中是否有一种方法可以将大查询字符串保存在文档中并在过滤后的查询中使用?

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

文档中的字段queryValue123id 将是Intersects((LONGSTRING))

那么有没有办法做类似select?q=*:*&fq=foo:{id:123.queryValue} 的事情

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

【问题讨论】:

    标签: solr


    【解决方案1】:

    两种可能:

    加入

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

    The Join Query Parser

    散列

    只要您只进行完全匹配,就可以在索引和查询时在客户端对字符串进行哈希处理。具体如何执行将取决于您选择的语言。对于python,您将使用hashlib 获得长字符串的哈希值,并使用sha256,您将获得一个可用于索引和查询的结果字符串,如果您使用的是十六进制形式,则该字符串为64 字节, 44 如果您使用的是 base64。

    例子:

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

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

    fq=hashed_id:19c9288c069c47667e2b33767c3973aefde5a2b52d477e183bb54b9330253f1e
    

    【讨论】:

      【解决方案2】:

      在执行您寻求的文字解决方案之前,您可能会寻找替代方法:

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

      【讨论】:

        猜你喜欢
        • 2012-02-02
        • 1970-01-01
        • 2013-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-28
        • 1970-01-01
        • 2017-06-17
        相关资源
        最近更新 更多