Solr - EDisMax - 完全匹配子短语

时间:2016-05-24 08:57:39

标签: solr solr5

我正在查询类别名称的简单核心,例如

  • 牛仔裤
  • SKINNY JEANS
  • BOOT CUT JEANS
  • ...

我通常使用EDisMax。我想要用户查询,例如:

  

BLUE SKINNY JEANS

仅匹配确切的类别。因此,在上述情况下,只有以下内容匹配:

  • SKINNY JEANS
  • 牛仔裤

我使用的是Solr 5.3.1。我试图实现类别" name"字段作为字符串类型,我查询以下参数:

"params": {
      "q": "SKINNY JEANS",
      "defType": "edismax",
      "indent": "true",
      "qf": "name",
      "pf": "name",
      "pf3": "name",
      "wt": "json",
      "pf2": "name",
      "lowercaseOperators": "true",
      "debugQuery": "true",
      "stopwords": "true",
      "_": "1464079436985"
    }

但只有JEANS匹配。对于我的生活,我不能让SKINNY JEANS与之匹敌。

我越来越熟悉Solr的分析仪,我尝试生成以下类型作为解决问题的方法:

fieldType name="text_phrase" class="solr.TextField" positionIncrementGap="100">

      <analyzer type="index">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.TrimFilterFactory" />
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>

      <analyzer type="query">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.TrimFilterFactory" />
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>

    </fieldType>

即。使用KeywordTokenizerFactory索引类别名称而不进行标记,但将查询与EDisMax的pf / pf2 / pf3字段一起标记,但这也不起作用。我不认为带状疱疹是一种解决方案,并且PositionFilterFactory似乎已被弃用。

如何为较小的子字符串查询大字符串?

谢谢,

2 个答案:

答案 0 :(得分:1)

由于您的查询方是对输入值进行标记,因此任何查询都将被分解为单独的标记,然后将与存储的值进行匹配。

在'SKINNY JEANS'的情况下,这将保留为索引(SKINNY JEANS)中的一个单一标记,而当您搜索时,该字符串被分成单独的标记 - 所以它正在尝试匹配BLUESKINNYJEANS。这些令牌都不匹配SKINNY JEANS(作为一个单一的大令牌)。

带状疱疹可以工作(至少比当前的解决方案更好),因为最终会以BLUE_SKINNYSKINNY_JEANS作为令牌,具体取决于您的字段配置。请记住,所有这些情况都会以JEANS SKINNY结尾,因为不会产生任何匹配。

我猜你可以在查询中使用shingle工厂解决这个问题,并在索引时插入适当的分隔符。该查询将BLUESKINNYJEANSBLUE_SKINNYSKINNY_JEANS作为要查询的值,而SKINNY_JEANS将被编入索引value - 意味着你将得到一个匹配(默认的分隔符为'',所以你最好将插入因子作为查询链的最后一步插入。

答案 1 :(得分:1)

pf / pf2 / pf3参数仅用于重新排列结果的顺序。他们必须首先匹配查询。这意味着您不能使用它们来删除任何结果,只是为了将最佳结果提升到顶部。如果要先删除结果,则需要使用其他方法(例如 mm 参数)。不幸的是,这是一个难题,因为Solr不知道用户意味着什么,以及哪些字段对于该特定查询是“必须的”。其中一些已在a series of articles by Ted Sullivan中讨论过,特别是有关查询自动过滤的内容。

此外,示例中的pf / pf2 / pf3仅用作普通字段名称,不带权重。这意味着他们实际上没有表明优先事项。你可能想要使用这样的东西:

  "pf":"name^10",
  "pf3":"name^3",
  "pf2":"name^2",

如果使用正确,您应该会看到调试中显示的短语(启用了 debugQuery 标志):

"+((name:blue) (name:skinny) (name:jeans)) ((name:\"blue skinny jeans\")^10.0) (((name:\"blue skinny\")^2.0) ((name:\"skinny jeans\")^2.0)) ((name:\"blue skinny jeans\")^3.0)"