我有一个带有大约的SOLR DB。 70M文件。某些查询返回大约300个文档。随着
我的架构中是否有错误?可以更快地完成吗?
<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" />
答案 0 :(得分:6)
字段A
的类型为string
,可以用作构面。你的领域B
被分析,你剥去了特殊的字符,你就小写了它,这对于一个方面来说不太好用。稍后的事情在应用StandardFilterFactory
。
在Solr's Wiki中,有一个关于方面的有趣部分
由于分面字段通常被指定用于两个目的,即人类可读的文本和向下钻取查询值,因此它们的索引常常与用于搜索和排序的字段不同:
- 它们通常不会被标记为单独的词语
- 它们通常不会映射到小写
- 通常不会删除人类可读的标点符号(双引号除外)
- 通常不需要存储它们,因为存储的值看起来很像索引值,并且构面机制用于值检索。
正如你所看到的那样,你错过了中间的两个点,你就是小写并删除了特殊的字符。
正如Indexing Fields with SOLR and LowerCaseFilterFactory中所述,您应该在架构中引入一个新字段,该字段应为string
类型,并通过copyField与您的字段B
保持同步。这个新领域应该用于分面,它应该更快。我们通常使用后缀来命名这些字段,例如B_raw
。
由于您拥有70万份文档,因此最好先使用子集进行测试,以节省您的时间。