Solr 7.6.0:如何在一个查询中组合不同的 QueryParser?

kat*_*tja 5 solr edismax

我只想将块连接查询和主查询与 edismax-parser 结合起来,就像我为 solr < 7.2 所做的那样

berlin OR _query_:"{!parent which=type:book}page_content:berlin"
Run Code Online (Sandbox Code Playgroud)

但 edismax 不能再成为用于此目的的默认解析器(s. https://issues.apache.org/jira/browse/SOLR-11501

因此它可以与 lucene-QueryParser 一起使用来查询父级:

q={!parent which="type:book"}{!edismax qf='page_content' v='berlin'}
Run Code Online (Sandbox Code Playgroud)

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

q=title:berlin* AND {!parent which="type:book"}{!edismax qf='page_content' v='berlin'}
Run Code Online (Sandbox Code Playgroud)

但当我尝试时

q={!edismax qf='title' v='berlin'} OR {!parent which="type:book"}{!edismax qf='page_content' v='berlin'}
Run Code Online (Sandbox Code Playgroud)

仅评估查询的第一部分。

我的文档是:

<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>
Run Code Online (Sandbox Code Playgroud)

有人有同样的问题吗?

多谢!

Eri*_*ult 6

这是因为,从 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"
Run Code Online (Sandbox Code Playgroud)

注意:Solr < 7.3 的文档中有示例提到uf参数中的逗号分隔列表,但预期的分隔符肯定是空格。

对于那些不使用edismax的人,您必须设置luceneMatchVersion=7.1.0为完全向后兼容。