代码之家  ›  专栏  ›  技术社区  ›  Bikas Katwal

Solr镶嵌面是否使用了额外的空间?如果是这样的话,如何避免在SOLR中的某些字段上刻面?

  •  0
  • Bikas Katwal  · 技术社区  · 6 年前

    我最近开始与Solr合作,目前正在探索Solr方面的支持。对于与文本相关的字段,我可以假定solr不会创建任何额外的数据结构来存储方面信息。

    如果我有以下JSON文档:

    {
    ...
    
    "name":"john"
    "department":"IT"
    "salary":10000 
    ...
    
    }
    

    我想搜索2个领域的部门和薪水。

    因此,对于department,我假设创建的反向索引/映射可以返回给定facet单词的文档列表,并且不使用额外的空间来显示facet信息。这个假设正确吗?或者solr使用额外的空间来支持方面?

    对于薪资字段中基于范围的方面,在solr索引文档以支持基于范围的查询时,是否创建了其他数据结构?

    如果solr使用额外的空间来支持方面,我可以对某些字段禁用它吗?我想索引这些字段,但不想在它们上进行方面搜索,就像我们提供的 "indexed=true" ?我的一个朋友说OracleEndeca有这个特性,我们可以在这里配置为禁用/启用一个字段的方面支持,所以,如果有的话,在solr中需要类似的东西。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Mysterion    6 年前

    一般来说,solr通常是索引字段上的方面,而不是存储的方面。

    Solr通常可以使用3种算法 faceting :

    • enum 枚举字段中的所有术语,计算与该术语匹配的文档与与匹配查询的文档的集合交集。

    • fc 通过对与查询匹配的文档进行迭代并对每个文档中出现的术语求和,计算方面计数。

    • fcs 单值字符串字段的每段字段方面。

    它们有不同的缺点和好处。但总的来说,您可以看到,这里不需要特殊的数据结构,所有这些都可以通过过滤查询或通过迭代索引中的文档来完成。对于范围刻面,有两种其他刻面方法:

    • filter 此方法基于其他facet.range参数生成范围,并为每个参数执行一个过滤器,该过滤器稍后与主查询结果集相交以获取计数。
    • dv 此方法迭代与主查询匹配的文档,并为每个文档找到正确的值范围。此方法将使用docvalues(如果为字段启用)或fieldcache。

    这导致下面的总结,因为刻面Solr可以得到 DocValues -这是一种内部记录字段值的特殊方法,对于某些目的(如排序和 刻面 ,而不是传统的索引。

    而且,这意味着如果 docValues="true" 对于一个字段,只要该字段用于排序、分面或函数查询,就会自动使用docvalues。

    到最后一个问题-如果您不需要在这个字段上进行分面或排序,您可以禁用这个字段的docValues(或者不要触摸它,因为默认情况下它是假的),这通常会为您节省一些空间。