代码之家  ›  专栏  ›  技术社区  ›  Bryan Ash

Solr filter查询可能为空的多值字段

  •  1
  • Bryan Ash  · 技术社区  · 7 年前

    我的每个索引文档都有一个多值字段 user_ids_ims 包含与文档相关的用户ID的。此字段可能为空。

    <types>
      <fieldType name="tint" class="solr.IntPointField" omitNorms="true"/>
    </types>
    
    <fields>
      <dynamicField name="*_ims" type="tint" multiValued="true"/>
    </fields>
    

    我想要对所有文档进行筛选查询,其中 用户\u ID\u ims 包含特定的id值,例如 42 ,或为空。e、 g.对于以下文件:

    { id: 'Page 1', user_ids_ims: [] }
    { id: 'Thing 1', user_ids_ims: [19, 24, 92] }
    { id: 'Thing 2', user_ids_ims: [19, 24, 42, 92] }
    { id: 'Thing 7', user_ids_ims: [19, 24, 92] }
    

    如何使用 fq 要包含一组文档,包括 Page 1 Thing 2 ?

    我可以 第1页 使用 fq=!user_ids_ims:[* TO *]

    我可以 事情2 使用 fq=user_ids_ims:(42)

    2 回复  |  直到 7 年前
        1
  •  3
  •   MatsLindh    7 年前

    实际的答案是将这两个要求结合起来:

    fq=user_ids_ims:(42) OR (*:* -user_ids_ims:[* TO *])
    

    后者 *:* 很重要,因为您必须有一组文档来减去返回的文档集 user_ids_ims:[* TO *] 从…起这将为您提供 42 在现场,或根本没有现场。

        2
  •  0
  •   Bryan Ash    7 年前

    这个 user_ids_ims 字段是使用MySQL列中的值填充的,该列定义为 AUTO_INCREMENT ,所以我知道 0 不是有效的 id .有了这些知识,我可以分配:

    { id: 'Page 1', user_ids_ims: [0] }
    

    现在我有2个定义的值要搜索,这很好,即。 fq=user_ids_ims:(0 42)