将Solr术语组件用于自动建议功能

时间:2016-12-20 14:54:50

标签: solr lucene

我尝试使用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&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&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>

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

目标

使其适用于title-field中包含的所有单词(如文档中所示)并使搜索不区分大小写。

试图解决它

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

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

2 个答案:

答案 0 :(得分:1)

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

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

如果你希望将内容中的每个术语分成它自己的标记,即杏,是,种类等,请使用WhitespaceTokenizer或StandardTokenizer以及LowercaseFilter。

答案 1 :(得分:0)

感谢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>