词元组件
词元组件提供对字段中已编制索引的词元的访问,以及与每个词元匹配的文档数。这对于构建自动建议功能或在词元级别(而不是搜索或文档级别)操作的任何其他功能非常有用。按索引顺序检索词元非常快,因为该实现直接使用 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
(docFreq) 和ttf
(totalTermFreq) 统计信息。在这种情况下,响应格式为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 感兴趣。
术语组件示例
以下所有示例查询都适用于 Solr 的“bin/solr -e techproducts”示例。
获取前 10 个术语
此查询请求 name 字段中的前十个术语
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 个术语
此查询请求 name 字段中的前十个术语,按索引顺序(而不是按文档计数的前 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>
在请求处理程序中使用术语组件
此查询使用术语信息增强常规搜索。
http://localhost: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");
将术语组件用于自动建议功能
如果建议器不适合您的需求,您可以使用 Solr 中的术语组件为自己的搜索应用程序构建类似的功能。只需提交一个查询,指定用户到目前为止键入的任何字符作为前缀。例如,如果用户键入了“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
]
}
}