词项组件
词项组件提供对字段中已索引词项的访问权限,以及匹配每个词项的文档数量。这对于构建自动建议功能或任何其他在词项级别而不是搜索或文档级别上运行的功能非常有用。由于实现直接使用 Lucene 的 TermEnum 来迭代词项字典,因此以索引顺序检索词项非常快。
从某种意义上说,此搜索组件提供了对整个索引的快速字段分面,而不受基础查询或任何过滤器的限制。返回的文档频率是匹配该词项的文档数量,包括任何已标记为删除但尚未从索引中删除的文档。
配置词项组件
词项组件是默认搜索组件之一,不需要在 solrconfig.xml
中定义。
其定义等效于
<searchComponent name="terms" class="solr.TermsComponent"/>
在请求处理器中使用词项组件
Solr 提供了一个隐式请求处理器定义 /terms
,该定义启用(仅)词项组件。
如果要在使用另一个请求处理器时启用词项组件,则需要在请求期间传递 terms=true
参数,或在处理程序的默认值中设置该参数。
词项组件参数
以下参数允许您控制返回哪些词项。如果需要永久设置,也可以使用请求处理器配置其中任何一个参数。或者,您可以将它们添加到查询请求中。这些参数是
terms
-
可选
默认值:
false
如果设置为
true
,则启用词项组件。示例:
terms=true
terms.fl
-
必需
默认值:无
指定从中检索词项的字段。如果
terms=true
,则此参数是必需的。可以多次指定此参数以检索不同字段的词项。示例:
terms.fl=title
示例:
terms.fl=title&terms=true&terms.fl=name&terms.list=cable,sony
<response>
<lst name="responseHeader">
<bool name="zkConnected">true</bool>
<int name="status">0</int>
<int name="QTime">4</int>
</lst>
<lst name="terms">
<lst name="name">
<int name="cable">8661</int>
<int name="sony">21</int>
</lst>
<lst name="title">
<int name="cable">11387</int>
<int name="sony">3921</int>
</lst>
</lst>
</response>
terms.list
-
可选
默认值:无
获取以逗号分隔的词项列表的文档频率。词项始终以索引顺序返回。如果
terms.ttf
设置为true
,则还会返回其总词项频率。如果定义了多个terms.fl
,则将为每个请求字段中的每个词项返回这些统计信息。示例:
terms.list=termA,termB,termC
当指定 terms.list
时,词项始终按index
排序。除了terms.ttf
之外,当指定terms.list
时,不支持其他词项参数。 terms.limit
-
可选
默认值:
10
指定要返回的最大词项数量。如果将限制设置为小于
0
的数字,则不强制执行最大限制。尽管这不是必需的,但必须定义此参数或terms.upper
。示例:
terms.limit=20
terms.lower
-
可选
默认值:请参阅说明
指定要开始的词项。如果未指定,则使用空字符串,导致 Solr 从字段的开头开始。
示例:
terms.lower=orange
terms.lower.incl
-
可选
默认值:
true
如果设置为
true
,则在结果集中包含下限项(由terms.lower
指定)。示例:
terms.lower.incl=false
terms.mincount
-
可选
默认值:
1
指定要包含在查询响应中的术语的最小文档频率。结果包含 mincount(即,>= mincount)。
示例:
terms.mincount=5
terms.maxcount
-
可选
默认值:
-1
指定要包含在查询响应中的术语必须具有的最大文档频率。默认设置为
-1
,表示没有上限。结果包含 maxcount(即,<= maxcount)。示例:
terms.maxcount=25
terms.prefix
-
可选
默认值:无
将匹配限制为以指定字符串开头的术语。
示例:
terms.prefix=inter
terms.raw
-
可选
默认值:
false
如果设置为
true
,则返回索引术语的原始字符,无论它是否是人类可读的。例如,数字的索引形式不是人类可读的。示例:
terms.raw=true
terms.regex
-
可选
默认值:无
将匹配限制为与正则表达式匹配的术语。
示例:
terms.regex=.*pedist
terms.regex.flag
-
可选
默认值:无
定义在评估使用
terms.regex
定义的正则表达式时要使用的 Java 正则表达式标志。有关每个标志的详细信息,请参阅 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
-
可选
默认值:
false
如果为
true
,则在结果中包含索引统计信息。当前仅返回集合的文档数量。当与terms.list
结合使用时,它提供了足够的信息来计算术语列表的逆文档频率 (IDF)。 terms.sort
-
可选
默认值:
count
定义如何对返回的术语进行排序。有效选项为
count
,按词频排序,词频最高的排在最前面;或index
,按索引顺序排序。示例:
terms.sort=index
terms.ttf
-
可选
默认值:
false
如果设置为
true
,则为terms.list
中每个请求的术语返回df
(文档频率)和ttf
(总术语频率)统计信息。在这种情况下,响应格式为XML
<lst name="terms"> <lst name="field"> <lst name="termA"> <long name="df">22</long> <long name="ttf">73</long> </lst> </lst> </lst>
JSON
{ "terms": { "field": [ "termA", { "df": 22, "ttf": 73 } ] } }
terms.upper
-
可选
默认值:无
指定停止的术语。虽然此参数不是必需的,但必须定义此参数或
terms.limit
。示例:
terms.upper=plum
terms.upper.incl
-
可选
默认值:
false
如果设置为 true,则上限术语包含在结果集中。
示例:
terms.upper.incl=true
术语请求的响应是术语列表及其文档频率值。
您可能还会对 TermsComponent javadoc 感兴趣。
Terms 组件示例
以下所有示例查询都适用于 Solr 的“bin/solr start -e techproducts”示例。
获取前 10 个术语
此查询请求 name 字段中的前十个术语
https://127.0.0.1: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 个术语
此查询请求 name 字段中的前十个术语,按索引顺序(而不是按文档计数排序的前 10 个结果)
https://127.0.0.1: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>
在请求处理程序中使用 Terms 组件
此查询使用术语信息增强了常规搜索。
https://127.0.0.1:8983/solr/techproducts/select?q=corsair&fl=id,name&rows=1&echoParams=none&wt=xml&terms=true&terms.fl=name
结果(请注意,术语计数不受查询的影响)
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">1</int>
</lst>
<result name="response" numFound="2" start="0" numFoundExact="true">
<doc>
<str name="id">VS1GB400C3</str>
<str name="name">CORSAIR ValueSelect 1GB 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) System Memory - Retail</str></doc>
</result>
<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>
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");
将 Terms 组件用于自动建议功能
如果 Suggester 不适合您的需求,您可以使用 Solr 中的 Terms 组件为您的搜索应用程序构建类似的功能。只需提交一个查询,将用户到目前为止键入的任何字符指定为前缀即可。例如,如果用户键入了“at”,则搜索引擎的界面将提交以下查询
https://127.0.0.1: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 格式返回响应
https://127.0.0.1:8983/solr/techproducts/terms?terms.fl=name&terms.prefix=at&omitHeader=true
结果
{
"terms": {
"name": [
"ata",
1,
"ati",
1
]
}
}