繁体   English   中英

Solr Shingle在调试查询中不可见

[英]Solr Shingle Is Not Visible In Debug Query

我正在尝试使用Solr在用户搜索中找到类别的完全匹配(eg "skinny jeans" in "blue skinny jeans") 我使用以下类型定义:

<fieldType name="subphrase" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true">
  <analyzer type="index">
    <charFilter class="solr.PatternReplaceCharFilterFactory" 
                pattern="\ " 
                replacement="_"/>
    <tokenizer class="solr.KeywordTokenizerFactory"/>
  </analyzer>
  <analyzer type="query">
  <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.ShingleFilterFactory" 
            outputUnigrams="true"
            outputUnigramsIfNoShingles="true"
            tokenSeparator="_"
            minShingleSize="2"
            maxShingleSize="99"/>
  </analyzer>
</fieldType>

该类型将索引类别而不进行标记,仅使用下划线替换空格。 但它会将查询标记化并将它们整理(带下划线)。

我想要做的是将查询带状疱疹与索引类别相匹配。 在Solr Analysis页面中,我可以看到空格/下划线替换在索引和查询上都有效,我可以看到查询正在被正确拼接(下面的屏幕截图):

对索引进行成功的空白修改,并在查询时生成shingle

我的问题是在Solr Query页面中,我看不到生成的带状疱疹,我认为结果类别“紧身牛仔裤”不匹配,但类别“牛仔裤”匹配:(

这是调试输出:

{
  "responseHeader": {
    "status": 0,
    "QTime": 1,
    "params": {
      "q": "name:(skinny jeans)",
      "indent": "true",
      "wt": "json",
      "debugQuery": "true",
      "_": "1464170217438"
    }
  },
  "response": {
    "numFound": 1,
    "start": 0,
    "docs": [
      {
        "id": 33,
        "name": "jeans",
      }
    ]
  },
  "debug": {
    "rawquerystring": "name:(skinny jeans)",
    "querystring": "name:(skinny jeans)",
    "parsedquery": "name:skinny name:jeans",
    "parsedquery_toString": "name:skinny name:jeans",
    "explain": {
      "33": "\n2.2143755 = product of:\n  4.428751 = sum of:\n    4.428751 = weight(name:jeans in 54) [DefaultSimilarity], result of:\n      4.428751 = score(doc=54,freq=1.0), product of:\n        0.6709952 = queryWeight, product of:\n          6.600272 = idf(docFreq=1, maxDocs=541)\n          0.10166174 = queryNorm\n        6.600272 = fieldWeight in 54, product of:\n          1.0 = tf(freq=1.0), with freq of:\n            1.0 = termFreq=1.0\n          6.600272 = idf(docFreq=1, maxDocs=541)\n          1.0 = fieldNorm(doc=54)\n  0.5 = coord(1/2)\n"
    },
    "QParser": "LuceneQParser"
  }
}

很明显,parsedquery参数不会显示带状疱疹的查询。 我需要做些什么才能完成将查询带状疱疹与索引值匹配的过程? 我觉得我非常接近解决这个问题。 任何建议表示赞赏!

这是一个不完整的答案,但它可能足以让你感动。

1:你可能想要outputUnigrams="false" ,所以你不能在查询“紧身牛仔裤”上匹配类别“jeans”

2:你实际上确实想要使用引号,(一个短语)进行搜索,否则该字段将不会看到多个令牌。

3:看起来你正试图和这个人做同样的事情: http//comments.gmane.org/gmane.comp.jakarta.lucene.user/34746

该线程看起来像导致包含PositionFilterFactory https://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.PositionFilterFactory

如果您使用的是Solr <5.0,请尝试将其放在查询时间分析的末尾,看看它是否有效。

不幸的是,该过滤器工厂已在5.0中删除。 这是我发现的关于该做什么的唯一评论: http//lucene.apache.org/core/4_10_0/analyzers-common/org/apache/lucene/analysis/position/PositionFilter.html

我玩了一下autoGeneratePhraseQueries ,但我还没有找到另一种方法来阻止Solr生成MultiPhraseQuery。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM