将Solr项组件用于自动符号功能



我正在尝试使用solr文档中所述的术语组件(请参见使用auto-suggest功能的component )。

先决条件

运行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}]
      }
}

我的字段定义看起来像这样(否则我的spech.xml是香草):

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

因此,它是一种有效的工作,但对细节不敏感,仅基于字符串的开头。

目标

使其适用于标题场中包含的所有单词(例如在文档中),并使搜索案例不敏感。

试图解决它

  • 我弄乱了标题场:显式设置indexedstored;设置multiValued=false;尝试了type=string
  • 我尝试了各种术语组件参数
  • 尝试实施与方面相似的东西(请参阅文档),但遇到了相同的问题。

我猜这与数据类型有关或索尔存储该字段有关系,但我无法弄清楚。

如果要在索引时较低范围的字段中的内容,则必须预处理内容(在索引之前将其放大),或更容易使用,请使用该字段类型有一个LowercaseFilter。该字段必须基于文本字段,但是您可以使用KeywordTokenizer将每个值作为单个令牌保留,而不是基于Whitespace或类似的东西被令牌化。

术语处理程序只是寻找匹配的代币,因此,通过使用关键字键语,您可以将所有内容保持为单个令牌,并且LowerCaseFilter确保索引令牌仅保留在小写中。

但是,如果您想要想要将内容中的每个术语划分为自己的令牌,即杏子,善良等,请使用whitespaceTokenizer或standardTokenizer,以及lowercasefilter。

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

最新更新