【问题标题】:How to use Solr Suggester ContextField with boolean field如何将 Solr Suggester ContextField 与布尔字段一起使用
【发布时间】:2019-10-28 21:48:56
【问题描述】:

我正在使用 Solr 6.0.0

我正在尝试从 Solr Suggester 中过滤掉不需要的建议。在我的 Solr 数据库中,我有我所有的产品

我的产品都有一个布尔字段“ShowOnSite”。准备出售的产品将此值设置为 true。尚未准备好的产品将其设置为 false。

当我尝试使用此布尔字段过滤来自建议者的建议结果时,我总是得到 0 个结果,即使我有很多产品可供展示。

我的产品看起来有点像这样:

<field name="id"                type="string"      indexed="true" stored="true" required="true"/>
<field name="Name"              type="string"      indexed="true" stored="true"/>
<field name="ShowOnSite"        type="boolean"     indexed="true" stored="true" />
<field name="text_autocomplete" type="textSuggest" indexed="true" stored="true"/>

textSuggest fieldType 有如下配置:

  <fieldType class="solr.TextField" name="textSuggest" positionIncrementGap="100">
    <analyzer>
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StandardFilterFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
  </fieldType>

我的推荐人看起来像这样

  <requestHandler name="/suggest" class="solr.SearchHandler" startup="lazy">
    <lst name="defaults">
      <str name="suggest">true</str>
      <str name="suggest.count">20</str>
      <str name="wt">json</str>
    </lst>
    <arr name="components">
      <str>suggest</str>
    </arr>
  </requestHandler>

  <searchComponent name="suggest" class="solr.SuggestComponent">
    <lst name="suggester">
      <str name="name">default</str>
      <str name="lookupImpl">AnalyzingInfixLookupFactory</str>
      <str name="highlight">true</str>
      <str name="dictionaryImpl">DocumentDictionaryFactory</str>
      <str name="field">text_autocomplete</str>
      <str name="weightField">InStock</str>
      <str name="contextField">ShowOnSite</str>
      <str name="suggestAnalyzerFieldType">textSuggest</str>
      <str name="buildOnStartup">true</str>
    </lst>
  </searchComponent>

我的查询如下所示:

/suggest?suggest.q={querystring}&suggest.cfq=true

预期 我只收到具有“ShowOnSite”== true 的产品

实际 我从推荐人那里收到了 0 件商品

我也尝试过其他配置。通过使用 not true 我得到 所有 产品:

/suggest?suggest.q={querystring}&suggest.cfq=-true

我也尝试在 cfq 中添加字段名称。这会产生 0 个产品:

/suggest?suggest.q={querystring}&suggest.cfq=ShowOnSite:true

编辑1 我也尝试过分别使用 0 或 1 表示 false 和 true。这些也不起作用

【问题讨论】:

  • 最初的猜测是这是由字段的布尔类型引起的,因为据我所知,cfq 使用的值没有进行任何分析。试试0,或者更好;将辅助字段作为字符串字段并将falsetrue 值逐字存储在该字段中 - 并尝试按此过滤。
  • @MatsLindh 感谢您的建议。我已经尝试过了,它有效。我只是很难理解为什么布尔值不起作用。过滤布尔值似乎是最基本的实现方式。
  • 我的猜测(我还没有验证过)是布尔字段类型是在 Solr 中创建的特殊字段类型,并且在 Lucene 中没有直接支持类似的类型。因此,当令牌true 作为令牌发送回索引时(没有进行分析等),它与实际存储的令牌不匹配。您可以通过查看该字段的索引中实际存储的内容和true/false 值来更深入地了解这一点。但正如我所说,这是一个猜测。这可能大错特错。

标签: solr boolean search-suggestion


【解决方案1】:

最初的猜测是这是由字段的布尔类型引起的,因为据我所知,没有对 cfq 使用的值进行任何分析。

将辅助字段设为字符串字段,并将 false 或 true 值逐字存储在该字段中 - 并将其用于过滤。

【讨论】:

    【解决方案2】:

    正如 MatsLindh 所建议的那样。请改用文本字段。 最简单的方法是复制该字段:

    将此添加到索引的托管模式文件(在 Solr 中):

      <field name="THE_FIELD_TO_BE_USED_BY_THE_SUGGESTER" type="text_general" indexed="true" stored="true" multiValued="false"/>
      <copyField source="YOUR_BOOLEAN_FIELD" dest="THE_FIELD_TO_BE_USED_BY_THE_SUGGESTER" maxChars="30000" />
    

    【讨论】:

      猜你喜欢
      • 2015-09-21
      • 2015-04-13
      • 2011-08-28
      • 2012-10-03
      • 1970-01-01
      • 2018-07-20
      • 2013-03-17
      • 1970-01-01
      相关资源
      最近更新 更多