gpt4 book ai didi

Solr Shingle 在调试查询中不可见

转载 作者:行者123 更新时间:2023-12-05 00:45:33 26 4
gpt4 key购买 nike

我正在尝试使用 Solr 在用户搜索 (例如,“blue skinny jeans”中的“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 页面中,我可以看到空格/下划线替换对索引和查询都有效,而且我可以看到查询被正确地重叠(下面的屏幕截图):

Successful whitespace modification on index, and shingle generation on query

我的问题是,在 Solr 查询页面中,我看不到正在生成带状疱疹,因此我推测类别“skinny jeans”不匹配,但类别“jeans”匹配 :(

这是调试输出:

{
"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 参数没有显示 shingled 查询。我需要做什么才能完成将查询带状疱疹与索引值匹配的过程?我觉得我已经非常接近解决这个问题了。任何建议表示赞赏!

最佳答案

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

1:您可能需要 outputUnigrams="false",因此您不会在查询“skinny jeans”时匹配类别“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。

关于Solr Shingle 在调试查询中不可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37433907/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com