词元组件

词元组件提供对字段中已编制索引的词元的访问,以及与每个词元匹配的文档数。这对于构建自动建议功能或在词元级别(而不是搜索或文档级别)操作的任何其他功能非常有用。按索引顺序检索词元非常快,因为该实现直接使用 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
    ]
  }
}