我正在尝试使用Solr在用户搜索(e.g. "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页面中,我可以看到空格/下划线替换在索引和查询上都有效,我可以看到查询正在被正确收集(截图如下):
我的问题是在Solr Query页面中,我看不到生成的带状疱疹,我认为因此“skinny 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参数不会显示带状疱疹的查询。我需要做些什么才能完成将查询带状疱疹与索引值匹配的过程?我觉得我非常接近解决这个问题。任何建议表示赞赏!
答案 0 :(得分:2)
这是一个不完整的答案,但它可能足以让你感动。
1:你可能想要outputUnigrams="false"
,所以你不能在查询“紧身牛仔裤”上找到“牛仔裤”类别
2:你实际上确实想要使用引号,(一个短语)进行搜索,或者该字段不会看到多个标记要叠加。
3:看起来你正试图和这个人做同样的事情: http://comments.gmane.org/gmane.comp.jakarta.lucene.user/34746
该线程看起来像导致包含PositionFilterFactory https://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.PositionFilterFactory
如果你正在使用Solr&lt; 5.0,尝试将其放在查询时间分析的最后,看看它是否有效。
不幸的是,该过滤器工厂已在5.0中删除。这是我发现的关于该做什么的唯一评论: http://lucene.apache.org/core/4_10_0/analyzers-common/org/apache/lucene/analysis/position/PositionFilter.html
我和autoGeneratePhraseQueries
玩了一点,但我还没有找到另一种方法阻止Solr生成MultiPhraseQuery。