【问题标题】:What is the use of "multiValued" field type in Solr?Solr 中的“multiValued”字段类型有什么用?
【发布时间】:2011-08-13 15:11:34
【问题描述】:

我是 Apache Solr 的新手。即使在阅读了documentation 部分之后,我仍然很难清楚地理解multiValued 字段类型属性的功能和用途。

Solr 在内部做什么/处理/处理标记为 multiValued 的字段?

在 Solr 中,multiValued 字段与非多值字段之间的索引有何区别?

有人可以举一些好的例子来解释吗?

文档说:

multiValued=true|false

如果这是真的 每个字段可能包含多个值 文件,即如果它可以出现 在一个文档中多次

【问题讨论】:

    标签: indexing full-text-search solr multivalue


    【解决方案1】:

    当字段存在多个值时,多值字段很有用。一个简单的例子是标签,可能有多个标签需要被索引。因此,如果我们将标签字段设置为多值,那么 solr 响应将返回一个列表而不是字符串值。需要注意的一点是,您需要为标签的每个值提交多行,例如:

    tag1 tag2 ... tagn

    拥有所有值索引后,您可以按任何值搜索或过滤结果,例如您可以使用如下查询找到所有带有 tag1 的文档

    q=tags:tag1
    

    或使用标签过滤掉类似的结果

    q=query&fq=tags:tag1
    

    【讨论】:

    • search or filter results by any value有什么区别/优势?在这种情况下,在 'q' 或 fq 中使用 tags:tag1 进行搜索有什么区别?
    • 每个值都可以是一个字符串,您可以精确匹配一组字符串。如果是单值字段,您可以使用标记化的单词或整个字符串。另一个用途是存储列表值,正如我在标签的情况下提到的,可以是数字,如数值列表。
    • @Gnanam:过滤后的查询被缓存,不会影响分数。它们的主要目的是创建一个固定的文档“超集”,然后可以对其进行搜索。示例:用户输入查询,应用程序应用附加约束,例如仅搜索用户拥有的文档。在这种情况下,应用程序会将约束“仅给定用户”发送为fq,并将实际搜索查询发送为q
    • 如果您不知道标签的值怎么办。例如,在对一组论文进行索引时,您想将“关键字”设置为多值字段,但您不知道所有值!
    【解决方案2】:

    我只对复制字段使用多值字段,所以这样想,说所有字段都是单值的,除非它是一个复制字段,例如我有以下字段:

    <field name="id" type="string" indexed="true" stored="true"/>
    <field name="name" type="string" indexed="true" stored="true"/>
    <field name="subject" type="string" indexed="true" stored="true"/>
    <field name="location" type="string" indexed="true" stored="true"/>
    

    我只想查询一个字段,可能要搜索上面的所有4个字段,那么我们需要使用copyfield。首先创建一个新字段调用'all',然后将所有内容复制到'all'

    <field name="all" type="text" indexed="true" stored="true" multiValued="true"/>
    <copyField source="*" dest="all"/>
    

    现在字段 'all' 需要是多值的。

    【讨论】:

      【解决方案3】:

      multiValued 在 schema 中定义是否允许字段有多个值。

      例如:
      如果我有一个名为 ID 的 fieldType,它是 multiValued=false 索引文档,例如:

      doc {
        id : [ 1, 2]
        ...
      }
      

      会导致在索引线程中抛出异常并且文档不会被索引(架构验证将失败)。

      另一方面,如果我确实有一个字段的多个值,我想设置 multiValued=true 以保证索引正确完成,例如:

      doc {
        id : 1
        keywords: [ hello, world ]
        ...
      }
      

      在这种情况下,您可以将“关键字”定义为多值字段。

      【讨论】:

      • 让我知道我是否理解正确。例如,如果我尝试使用 DataImportHandler 直接从数据库中索引数据,并且如果我的数据库字段 tag 类型之一是 VARCHAR[](varchar 数组),那么映射此 tag 字段为多值。我的理解正确吗?
      • 迟到了,但我通常会说是的……但永远不要说永远也不要说永远
      猜你喜欢
      • 2018-11-23
      • 1970-01-01
      • 2018-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-11
      相关资源
      最近更新 更多