facet查询的时间差异很大

Ste*_*iss 3 solr

我有一个SOLR DB与ca. 70M文件.某些查询返回大约300个文档.同

  • facet.field = A只用了4毫秒,
  • facet.field = B需要800毫秒才能返回!

我的架构中有错误吗?可以更快地完成吗?

<fieldtype name="B_type" class="solr.TextField" positionIncrementGap="100"    
           sortMissingLast="true" omitNorms="true">
    <analyzer type="index">
        <tokenizer class="solr.KeywordTokenizerFactory" />
        <filter class="solr.StandardFilterFactory" ignoreCase="true" />
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.KeywordTokenizerFactory" />
        <filter class="solr.StandardFilterFactory" ignoreCase="true" />
    </analyzer>
</fieldtype>

<field name="A" type="string" indexed="true" stored="true" multiValued="false" />
<field name="B" type="B_type" indexed="true" stored="false" multiValued="true" />
Run Code Online (Sandbox Code Playgroud)

che*_*ffe 6

A是类型的string,适合用作刻面.你的领域B被分析,你剥离了特殊的字符,你小写它,这不是很好用作一个方面.后来的事情是在应用时完成的StandardFilterFactory.

Solr的Wiki中,有一个关于方面的有趣部分

由于分面字段通常被指定用于两个目的,即人类可读文本和向下钻取查询值,因此它们通常与用于搜索和排序的字段的索引不同:

  • 它们通常不会被标记为单独的词
  • 它们通常不会映射到小写字母
  • 通常不会删除人类可读的标点符号(双引号除外)
  • 通常不需要存储它们,因为存储的值看起来很像索引值,并且分面机制用于值检索.

你可以看到你错过了中间的两个点,你小写并删除了特殊的字符.

正如在索引字段中使用SOLR和LowerCaseFilterFactory所建议的那样,您应该在模式中引入一个新字段,该字段应该是类型,stringB通过copyField 与您的字段保持同步.这个新领域应该用于分面,它应该更快.我们通常用后缀命名这些字段,比如B_raw.

由于您拥有70米的文档,因此最好先使用子集进行测试以节省您的时间.