TermsComponent组件介绍
从某种意义上说,这个搜索组件在整个索引上提供了快速的 field-faceting,不受基本查询或任何过滤器的限制。返回的文档频率是与该词匹配的文档数量,包括任何已被标记为删除但尚未从索引中删除的文档。
配置TermsComponent组件
默认情况下,TermsComponent组件已在 solrconfig.xml 针对每个集合进行了配置。
定义TermsComponent组件
定义 Term 搜索组件很简单:简单地给它一个名称并使用 solr.TermsComponent 类。
<searchComponent name="terms" class="solr.TermsComponent"/>
这使得该组件可供使用,但是直到包含在请求处理程序中才会被使用。
在请求处理程序中使用TermsComponent组件
TermsComponent 组件包含在 Solr 的现成的请求处理程序中的 /terms 请求处理程序中 - 请参阅 Implicit RequestHandlers。
请注意,此请求处理程序的默认值将参数 “terms” 设置为 true,这允许根据请求返回条件。参数 “distrib” 被设置为 false,这使得这个处理程序只能在一个 Solr 内核上使用。
如果您愿意的话,您可以将这个组件添加到另一个处理程序中,并且在 HTTP 请求中传递 “terms = true” 以获得条件。如果仅在单独的处理程序中定义它,则在查询时必须使用该处理程序,以获取条件而不是将常规文档作为结果。
TermsComponent 组件参数
以下参数允许您控制返回的 term。如果您想永久设置它们,也可以使用请求处理程序来配置其中的任何一个。或者,您可以将它们添加到查询请求中。这些参数是:
- terms 参数
如果设置为
true
,则启用条款组件。默认情况下,条款组件处于关闭状态(false
)。例:terms=true
- terms.fl 参数
指定从中检索 term 的字段。如果
terms=true
,则该参数是必需的。例:terms.fl=title
- terms.list 参数
获取逗号分隔的 term 列表的文档频率。词总是以索引顺序返回。如果
terms.ttf
设置为 true,则返回它们的总词频。如果定义了多个terms.fl
,那么这些统计数据将在每个请求的字段中为每个词返回。例:
terms.list=termA,termB,termC
- terms.limit 参数
指定要返回的最大 term 数。默认是
10
。如果限制设置为小于0的数字,则不执行最大限制。虽然这不是必需的,但是这个参数或者terms.upper
必须被定义。例:
terms.limit=20
- terms.lower 参数
指定开始的 term。如果未指定,则使用空字符串,从而导致 Solr 从字段的开始处开始。
例:
terms.lower=orange
- terms.lower.incl 参数
如果设置为 true,则包含下限项(在结果中指定
terms.lower
)。例:
terms.lower.incl=false
- terms.mincount 参数
指定要返回的最小文档频率,以便将术语包含在查询响应中。结果包括小数(即 >= mincount)。
例:
terms.mincount=5
- terms.maxcount 参数
指定一个 term,为了包含在查询响应中而必须具有的最大文档频率。默认设置是-1,它不设置上限。结果包含 maxcount(即<= maxcount)。
例:
terms.maxcount=25
- terms.prefix 参数
限制匹配以指定字符串开头的 term。
例:
terms.prefix=inter
- terms.raw 参数
如果设置为 true,则返回索引项的原始字符,而不管其是否可读。例如,索引形式的数字是不可读的。
例:
terms.raw=true
- terms.regex 参数
限制符合正则表达式的条件。
例:
terms.regex=.*pedist
- terms.regex.flag 参数
定义一个 Java 正则表达式标志,用于计算
terms.regex
定义的表达式。有关每个标志的详细信息,请参见:http://docs.oracle.com/javase/tutorial/essential/regex/pattern.html。有效的选项是:
-
case_insensitive
-
comments
-
multiline
-
literal
-
dotall
-
unicode_case
-
canon_eq
-
unix_lines
例:
terms.regex.flag=case_insensitive
-
- terms.stats 参数
在结果中包含索引统计信息。目前只返回一个集合的 numDocs。当与
terms.list
结合时它提供足够的信息来计算术语列表的逆文件频率(IDF)。 - terms.sort 参数
定义如何对返回的条件进行排序。有效选项
count
按频率排序,首先选择最高频率,或index
按索引顺序排序。
例:
terms.sort=index
- terms.ttf 参数
如果设置为 true,那么同时返回
df
(docFreq)和ttf
(totalTermFreq)统计信息,在terms.list
请求 term 中。在这种情况下,响应格式是:<lst name="terms"> <lst name="field"> <lst name="termA"> <long name="df">22</long> <long name="ttf">73</long> </lst> </lst> </lst>
- terms.upper 参数
指定要停止的术语。虽然此参数不是必需的,但是该参数或
terms.limit
必须定义。例:
terms.upper=plum
- terms.upper.incl 参数
如果设置为 true,则结果集合中将包含上限项目。默认值是 false。
例:
terms.upper.incl=true
对 term 请求的回应是 term 及其文档频率值的列表。
TermsComponent组件示例
以下所有示例查询均适用于 Solr 的 “bin / solr -e techproducts” 示例。
如何获得前10 的排序
该查询请求名称字段中的前十个 term:
http://localhost:8983/solr/techproducts/terms?terms.fl=name&wt=xml
结果如下:
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">2</int>
</lst>
<lst name="terms">
<lst name="name">
<int name="one">5</int>
<int name="184">3</int>
<int name="1gb">3</int>
<int name="3200">3</int>
<int name="400">3</int>
<int name="ddr">3</int>
<int name="gb">3</int>
<int name="ipod">3</int>
<int name="memory">3</int>
<int name="pc">3</int>
</lst>
</lst>
</response>
从字母 "a" 开始获取前10 的 term
这个查询按索引顺序(而不是按文档数计算的前10个项)请求名称字段中的前十个项:
http://localhost:8983/solr/techproducts/terms?terms.fl=name&terms.lower=a&terms.sort=index&wt=xml
结果如下:
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">0</int>
</lst>
<lst name="terms">
<lst name="name">
<int name="a">1</int>
<int name="all">1</int>
<int name="apple">1</int>
<int name="asus">1</int>
<int name="ata">1</int>
<int name="ati">1</int>
<int name="belkin">1</int>
<int name="black">1</int>
<int name="british">1</int>
<int name="cable">1</int>
</lst>
</lst>
</response>
SolrJ 调用
SolrQuery query = new SolrQuery();
query.setRequestHandler("/terms");
query.setTerms(true);
query.setTermsLimit(5);
query.setTermsLower("s");
query.setTermsPrefix("s");
query.addTermsField("terms_s");
query.setTermsMinCount(1);
QueryRequest request = new QueryRequest(query);
List<Term> terms = request.process(getSolrClient()).getTermsResponse().getTerms("terms_s");
将 TermsComponent 组件用于自动建议功能
如果 Suggester 不符合您的需求,则可以使用 Solr 中的 Terms 组件为您自己的搜索应用程序构建一个类似的功能。只需提交一个查询,指定用户键入的前缀的任何字符。例如,如果用户输入“at”,则搜索引擎的接口将提交以下查询:
http://localhost:8983/solr/techproducts/terms?terms.fl=name&terms.prefix=at&wt=xml
结果如下:
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">1</int>
</lst>
<lst name="terms">
<lst name="name">
<int name="ata">1</int>
<int name="ati">1</int>
</lst>
</lst>
</response>
您可以使用参数 omitHeader=true 从查询响应中省略响应头,就像在这个例子中一样,它也以 JSON 格式返回响应:
http://localhost:8983/solr/techproducts/terms?terms.fl=name&terms.prefix=at&omitHeader=true
结果如下:
{
"terms": {
"name": [
"ata",
1,
"ati",
1
]
}
}
分布式搜索支持
TermsComponent 也支持分布式索引。对于 /terms 请求处理程序,您必须提供以下两个参数:
- shards 参数
指定分布式索引配置中的分片。有关分布式索引的更多信息,请参见使用索引分片的分布式搜索。
- shards.qt 参数
指定 Solr 用于请求分片的请求处理程序。