我正在查询类别名称的简单核心,例如
我通常使用EDisMax。我想要用户查询,例如:
BLUE 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似乎已被弃用。
如何为较小的子字符串查询大字符串?
谢谢,
答案 0 :(得分:1)
由于您的查询方是对输入值进行标记,因此任何查询都将被分解为单独的标记,然后将与存储的值进行匹配。
在'SKINNY JEANS'的情况下,这将保留为索引(SKINNY JEANS
)中的一个单一标记,而当您搜索时,该字符串被分成单独的标记 - 所以它正在尝试匹配BLUE
,SKINNY
和JEANS
。这些令牌都不匹配SKINNY JEANS
(作为一个单一的大令牌)。
带状疱疹可以工作(至少比当前的解决方案更好),因为最终会以BLUE_SKINNY
,SKINNY_JEANS
作为令牌,具体取决于您的字段配置。请记住,所有这些情况都会以JEANS SKINNY
结尾,因为不会产生任何匹配。
我猜你可以在查询中使用shingle工厂解决这个问题,并在索引时插入适当的分隔符。该查询将BLUE
,SKINNY
,JEANS
,BLUE_SKINNY
,SKINNY_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)"