我正在查询一个简单的核心类别名称。
我通常使用EDisMax。我希望用户查询,例如:
蓝色紧身牛仔裤
只匹配确切的类别。因此,在上述情况下,只有以下几项应该匹配:
我用的是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"
}但只有牛仔裤才配得上。为了我的命,我不能让紧身牛仔裤相配。
我对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/pf 2/pf3字段结合使用,但这也不起作用。我不认为带状疱疹是一个解决方案,而且PositionFilterFactory似乎不受欢迎。
如何EDisMax查询大字符串以获得较小的子字符串?
谢谢,
发布于 2016-05-25 08:23:39
pf/pf2/pf3参数只是为了重新排列结果的顺序而起作用。它们必须首先匹配查询。这意味着你不能用它们来放弃任何结果,仅仅是为了把最好的结果提升到顶端。如果希望首先删除结果,则需要使用其他方法(例如,mm参数)。不幸的是,这是一个很难解决的问题,因为Solr不知道什么是用户的意思,哪些字段对于特定的查询是“强制的”。其中一些已经在泰德·沙利文的系列文章中讨论过,特别是关于查询自动筛选的。
此外,在您的示例中,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)"发布于 2016-05-24 09:27:33
因为您的查询端正在标记输入值,所以任何查询都将被分解为单独的令牌,然后这些标记将与存储的值匹配。
在“瘦身牛仔裤”的情况下,这将作为索引(SKINNY JEANS)中的一个标记保存下来,而在搜索时,字符串会被分割成不同的标记--因此它试图匹配BLUE、SKINNY和JEANS。这两个令牌都不匹配SKINNY JEANS (作为一个单一的大型令牌)。
Shingles可以工作(至少比当前的解决方案更好),因为这将以BLUE_SKINNY、SKINNY_JEANS作为令牌结束,这取决于您的字段配置。请记住,所有这些情况都会导致JEANS SKINNY无法生成任何匹配。
我猜您可以通过查询中的板条工厂来解决这个问题,并在索引时插入适当的分隔符。该查询将以BLUE、SKINNY、JEANS、BLUE_SKINNY、SKINNY_JEANS作为查询的值,而SKINNY_JEANS则是索引的值--这意味着您将得到一个匹配(默认分隔符为‘',因此插入板条因子作为查询链的最后一步应该更好。
https://stackoverflow.com/questions/37408786
复制相似问题