【问题标题】:Solr 7.6.0: How to combine different QueryParser in one query?Solr 7.6.0:如何在一个查询中组合不同的 QueryParser?
【发布时间】:2019-09-09 00:35:36
【问题描述】:

我只想将块连接查询和主查询与 edismax-parser 结合起来,就像我为 solr

berlin OR _query_:"{!parent which=type:book}page_content:berlin"

但是 edismax 不能再作为这个目的的默认解析器了(s.https://issues.apache.org/jira/browse/SOLR-11501

所以它与 lucene-QueryParser 一起用于查询父母:

q={!parent which="type:book"}{!edismax qf='page_content' v='berlin'}

它仍然适用于添加主查询,例如

q=title:berlin* AND {!parent which="type:book"}{!edismax qf='page_content' v='berlin'}

但是当我尝试时

q={!edismax qf='title' v='berlin'} OR {!parent which="type:book"}{!edismax qf='page_content' v='berlin'}

只评估查询的第一部分。

我的文档是:

<add>
  <doc>
    <field name="id">1</field>
    <field name="type">book</field>
    <field name="title">Book about Berlin</field>
    <field name="pages">
    <doc>
      <field name="id">11</field>
      <field name="type">page</field>
      <field name="page_content">berlin in winter</field>
    </doc>
    <doc>
      <field name="id">12</field>
      <field name="type">page</field>
      <field name="page_content">berlin in spring</field>
    </doc>
    <doc>
      <field name="id">13</field>
      <field name="type">page</field>
      <field name="page_content">berlin in summer</field>
    </doc>
  </field>
 </doc>
 <doc>
    <field name="id">2</field>
    <field name="type">book</field>
    <field name="title">Big book about Tokio</field>
    <field name="pages">
    <doc>
      <field name="id">21</field>
      <field name="type">page</field>
      <field name="page_content">tokio in winter</field>
    </doc>
    <doc>
      <field name="id">22</field>
      <field name="type">page</field>
      <field name="page_content">tokio in spring</field>
    </doc>
    <doc>
      <field name="id">23</field>
      <field name="type">page</field>
      <field name="page_content">tokio in summer</field>
    </doc>
  </field>
 </doc>
</add>

有人遇到同样的问题吗?

非常感谢!

【问题讨论】:

  • 我终于完全重写了我的答案,我的假设不正确!希望uf 能来救援。

标签: solr edismax


【解决方案1】:

这是因为,从 Solr 7.3 开始,关于 edismax 的可搜索字段的默认设置实际上禁止使用嵌入式查询。

希望这种行为可以通过uf 参数进行管理。

uf :指定允许最终用户显式查询哪些架构字段并切换是否嵌入 Solr 查询 支持的。该参数支持通配符。必须是多个字段 用空格隔开。

默认是允许所有字段和不嵌入 Solr 查询, 相当于uf=* -_query_

设置uf=* _query_ 以允许嵌入查询。

我在 Solr 7.7.1 上对其进行了测试,它可以工作,但我必须将嵌入的查询用双引号括起来,否则 整个 查询失败 返回 0 结果,恕不另行通知.

这个查询应该可以工作:

defType=edismax&uf=* _query_&q=title:berlin* OR "{!parent which="type:book"}page_content:berlin"

注意:在 Solr uf 参数中提到了一个逗号分隔的列表,但预期的分隔符肯定是一个空格。

对于不使用 edismax 的用户,您必须设置 luceneMatchVersion=7.1.0 以实现完全向后兼容。

【讨论】:

  • 非常感谢 Eric,但据我了解和测试,当 edismax 是默认解析器 (SOLR-11501) 时,不允许 solr > 7.1 使用任何其他解析器。最高 7.2 它可以工作
  • 我现在不能尝试,但是如果我在 solrconfig 中将 edismax 定义为默认解析器,那么它肯定不起作用,这与将它放在 url-param 中应该是一样的
  • @katja ...该死的!同时我意识到 edismax 的模式字段实际上 prohibits 使用 _query_ 所以你必须明确设置 uf=*,_query_ 才能工作(它也应该内联工作) .此外,您仍然可以设置 luceneMatchVersion=7.1.0 以获得完全的向后兼容性。我现在没有时间研究它,但我会在周末进行一些测试并相应地更新答案。
  • 感谢@Eric,它可以工作 defType=edismax&uf=* query_&q=book AND _query:"{!parent which=type:book}page_content:berlin"
  • 酷!请考虑阅读this,感谢您的反馈
猜你喜欢
  • 2022-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-14
  • 1970-01-01
  • 2015-06-25
  • 1970-01-01
相关资源
最近更新 更多