codecamp

TermsComponent组件介绍

TermsComponent组件提供对字段中的索引词的访问以及与每个词匹配的文档数量。这对于构建 auto-suggest 功能或在 term 级别而不是搜索或文档级别操作的任何其他功能都很有用。检索索引顺序中的 term 非常快,因为实现直接使用 Lucene 的 TermEnum 来遍历术语字典。

从某种意义上说,这个搜索组件在整个索引上提供了快速的 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 用于请求分片的请求处理程序。

Solr结果集群
Solr空间搜索
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

SolrCloud

SolrCloud配置和参数

如何使用AsciiDoc

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }