我最近开始使用solr,目前我正在探索solr facet支持。对于与文本相关的字段,我可以假设solr没有创建任何其他数据结构来存储构面信息。
如果我有以下json文件:
{
...
"name":"john"
"department":"IT"
"salary":10000
...
}
我想对2个领域的部门和工资进行分面搜索。
因此,在部门的情况下,我假设创建的反向索引/地图可以返回给定构面字的文档列表,并且不使用额外的空间来显示构面信息。这个假设是否正确?或者solr使用额外的空间来支持小平面?
对于工资字段中基于范围的构面,是否正确创建其他数据结构,而solr会将文档编入索引以支持基于范围的查询?
如果Solr使用额外的空间来支持facet,我是否可以为我想要索引的某些字段禁用它,但不希望对它们进行构面搜索,例如我们如何给"indexed=true"
?我的一位朋友说,Oracle endeca有这个功能,我们可以配置为字段禁用/启用facet支持,所以,我在solr中需要类似的东西,如果存在的话。
答案 0 :(得分:2)
一般而言 - Solr通常面向索引字段,而不是存储。
有3种算法,Solr可以用于通常的faceting:
<强> enum
强>
枚举字段中的所有术语,计算与术语匹配的文档的集合交集与匹配查询的文档。
fc
通过迭代与查询匹配的文档并汇总每个文档中显示的字词来计算构面数。
fcs
单值字符串字段的每段细分字段。他们有不同的缺点和好处。但总的来说,你可以看到,这里不需要特殊的数据结构,所有这些都可以通过过滤查询或迭代索引中的文档来完成。对于范围刻面,还有其他两种刻面方法:
filter
此方法根据其他facet.range参数生成范围,并为每个参数执行一个过滤器,该过滤器稍后与主查询结果集相交以获取计数。 / LI>
dv
此方法会迭代与主查询匹配的文档,并为每个文档找到值的正确范围。此方法将使用docValues(如果为字段启用)或fieldCache。 导致以下摘要,对于分面Solr可以使用DocValues - 这是在内部记录字段值的特殊方式,对于某些目的更有效,例如排序和 faceting ,而不是传统的索引。
此外,这意味着如果某个字段为docValues="true"
,则只要该字段用于排序,分面或函数查询,就会自动使用DocValues。
回到最后一个问题 - 如果你不需要在这个字段上进行分面或排序,你可以为这个字段禁用docValues(或者只是不要触摸它,因为默认情况下它是假的),一般来说会为你节省一些空间。