我正在尝试使用solr 7.x获取搜索的最低/最高价格,以便在此教程之后填充最低/最高价格过滤器:
https://qavi.tech/get-minimum-and-maximum-price-in-solr/
https://lucene.apache.org/solr/guide/6_6/the-stats-component.html
字段:
<field name="price" type="tint" indexed="true" stored="true" required="false" />
Solr返回以下错误:
“ msg”:“没有docValues不能在PointField上计算统计信息”, “代码”:400
这可能是什么原因,我必须在solr_conf中启用它吗?
<searchComponent name="stats" class="solr.StatsComponent" />
答案 0 :(得分:1)
这可能取决于在模式中如何定义fieldType。
tint
曾经是TrieIntField
实现的首选名称,该实现支持排序,统计信息计算等,而无需启用docValues,因此可能是您的字段类型实现了另一个类(PointField类),实际上确实依靠docValues实现相同的目标。
例如,它可能是IntPointField
:
整数字段(32位带符号整数)。此类编码int值 使用基于“维度点”的数据结构, 有效搜索特定值或值范围。对于 单值字段docValues =“ true”必须用于启用排序。
好吧,实际上它应该是IntPointField
,因为从Solr 7.0开始,Trie字段deprecated支持Point字段:
TrieField使用类型参数来定义要使用的Trie *字段的特定类。请改用适当的“点字段”类型:
T̶r̶i̶e̶D̶a̶t̶e̶F̶i̶e̶l̶d̶> DatePointField
̶T̶r̶i̶e̶D̶o̶u̶b̶l̶e̶F̶i̶e̶l̶d̶> DoublePointField
T̶r̶i̶e̶F̶l̶o̶a̶t̶F̶i̶e̶l̶d̶> FloatPointField
T̶r̶i̶e̶I̶n̶t̶F̶i̶e̶l̶d̶> IntPointField
T̶r̶i̶e̶L̶o̶n̶g̶F̶i̶e̶l̶d̶> LongPointField
现在,错误显示为“没有docValues不能在PointField上计算统计信息” ,所以:
price
不是此处涉及的字段,因为其类型tint
将引用(通常是引用)TrieIntField,而不是PointField。这意味着另一个不使用docValues的PointField负责该错误。 price
是一个PointField,所以首先其类型应为pint
或它所引用的fieldType的名称,但不能为tint
(除非fieldType本身的命名错误),并且其次,它需要启用docValues来计算统计信息。 因此,在schema.xml中设置正确的field / fieldType定义,显式引用IntPointField类型,并启用docValues(向字段或字段类型定义中添加docValues="true"
)将有所帮助。例如:
<fieldType name="pint" class="solr.IntPointField" docValues="true"/>
<field name="price" type="pint" indexed="true" stored="true" required="false" />