【问题标题】:Using the Solr Terms Component for an Auto-Suggest Feature将 Solr 术语组件用于自动建议功能
【发布时间】:2016-12-20 14:54:50
【问题描述】:

我正在尝试使用 in the Solr docs 中描述的术语组件(请参阅将术语组件用于自动建议功能)。

先决条件

运行 Solr 6.3.0。

我的索引中目前有 4 个文档:

{
  "responseHeader":{
    "status":0,
    "QTime":0,
    "params":{
      "q":"*:*",
      "indent":"on",
      "wt":"json",
      "_":"1482239790124"}},
  "response":{"numFound":4,"start":0,"docs":[
      {
        "id":"1",
        "title":["There's nothing better than a shiny red apple on hot summer day."],
        "_version_":1554244409915080704},
      {
        "id":"2",
        "title":["Eat an apple!"],
        "_version_":1554244409917177856},
      {
        "id":"3",
        "title":["I prefer a Grannie Smith apple over Fuji."],
        "_version_":1554244409917177857},
      {
        "id":"4",
        "title":["Apricots is kinda like a peach minus the fuzz."],
        "_version_":1554244409917177858}]
      }
}

我的字段定义如下所示(否则我的 scheme.xml 是 vanilla):

<field name="title" type="strings" indexed="true" stored="true"/>

我的条款组件是默认的(就像我的整个 solarconfig.xml 一样):

<searchComponent name="terms" class="solr.TermsComponent"/>

<requestHandler name="/terms" class="solr.SearchHandler" startup="lazy">
  <lst name="defaults">
    <bool name="terms">true</bool>
    <bool name="distrib">false</bool>
  </lst>
  <arr name="components">
    <str>terms</str>
  </arr>
</requestHandler>

问题

在发出http://localhost:8983/solr/test/terms?terms.fl=title&amp;terms.prefix=ap 之类的请求时,我期望得到以下回报:

<response>
  <lst name="responseHeader">
    <int name="status">0</int>
    <int name="QTime">1</int>
  </lst>
  <lst name="terms">
    <lst name="title">
      <int name="apple">3</int>
      <int name="Apricots">1</int>
    </lst>
  </lst>
</response>

但我实际上得到的是一个空洞的回应。

当我改为 http://localhost:8983/solr/test/terms?terms.fl=title&amp;terms.prefix=Ea 时,我得到:

<response>
  <lst name="responseHeader">
      <int name="status">0</int>
      <int name="QTime">0</int>
  </lst>
  <lst name="terms">
    <lst name="title">
      <int name="Eat an apple!">1</int>
    </lst>
  </lst>
</response>

所以它有点工作,但不区分大小写,仅基于字符串的开头。

目标

使其适用于标题字段中包含的所有单词(如在文档中)并使搜索不区分大小写。

试图解决它

  • 我弄乱了标题字段:明确设置indexedstored;设置multiValued=false;试过type=string
  • 我尝试了各种Terms组件参数
  • 尝试使用 facets (see docs) 实现类似的东西,但遇到了同样的问题。

我猜测它与数据类型或Solr如何存储字段有关,但我无法弄清楚。

【问题讨论】:

    标签: solr lucene


    【解决方案1】:

    如果要在索引时将字段的内容小写,则必须对内容进行预处理(在索引之前将其变为小写),或者更简单,使用具有LowercaseFilter 的字段类型。该字段必须基于 TextField,但您可以使用 KeywordTokenizer 将每个值保留为单个标记,而不是基于空格或类似内容对其进行标记。

    terms 处理程序只查找匹配的标记,因此通过使用 KeywordTokenizer,您可以将所有内容保留为单个标记,并且 LowercaseFilter 确保索引标记以小写形式保留。

    如果您想要将内容中的每个术语拆分为自己的标记,即杏子、is、种类等,请使用 WhitespaceTokenizer 或 StandardTokenizer 以及 LowercaseFilter。 p>

    【讨论】:

      【解决方案2】:

      感谢 Mats 为我指明了正确的方向。

      我的标题字段的字段类型确实错误,我需要使用另一个。在创建自己的文件时,我注意到默认的 schema.xml 有一堆预定义的字段类型,它们完全符合我的要求。

      就我而言,我只需将字段类型设置为 text_de:

      <field name="title" type="text_de" indexed="true" stored="true"/>
      

      text_de 的预定义如下:

      <fieldType name="text_de" class="solr.TextField" positionIncrementGap="100">
        <analyzer>
          <tokenizer class="solr.StandardTokenizerFactory"/>
          <filter class="solr.LowerCaseFilterFactory"/>
          <filter class="solr.StopFilterFactory" format="snowball" words="lang/stopwords_de.txt" ignoreCase="true"/>
          <filter class="solr.GermanNormalizationFilterFactory"/>
          <filter class="solr.GermanLightStemFilterFactory"/>
        </analyzer>
      </fieldType>
      

      【讨论】:

        猜你喜欢
        • 2014-09-20
        • 1970-01-01
        • 2010-10-08
        • 2012-08-05
        • 2018-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多