我在如何构建Solr查询或如何设置模式以使我们的网上商店中的搜索更好地工作方面遇到了一些困难.
首先是一些配置(Solr 4.2.1)
<field name="mfgpartno" type="text_en_splitting_tight" indexed="true" stored="true" />
<field name="mfgpartno_sort" type="string" indexed="true" stored="false" />
<field name="mfgpartno_search" type="sku_partial" indexed="true" stored="true" />
<copyField source="mfgpartno" dest="mfgpartno_sort" />
<copyField source="mfgpartno" dest="mfgpartno_search" />
<fieldType name="sku_partial" class="solr.TextField" omitTermFreqAndPositions="true">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory" preserveOriginal="1" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="1" splitOnCaseChange="1"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.TrimFilterFactory" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="false"/>
<filter class="solr.NGramFilterFactory" minGramSize="4" maxGramSize="100" side="front" />
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.TrimFilterFactory" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="false"/>
</analyzer> …Run Code Online (Sandbox Code Playgroud) 我正在为我们的网站开发产品过滤器,但在使用“facet.missing = true”时遇到了一些困难。
我知道我应该使用像“fq=-facetField:[* TO *]”这样的查询过滤器来将结果过滤到缺少该字段的产品。
我为我的应用程序构建了一个全局过滤器助手,它为所有查询动态构建 fq 参数,以防止任何人错过基于用户权限的过滤器,它基本上如下所示(php):
$params['fq'] = sprintf('((%s) AND (%s))', $custom, $system);
Run Code Online (Sandbox Code Playgroud)
其中 $system 是基于全局权限的过滤器,它可能看起来像(不是实际但相似):
(isdiscontinued:0 AND ishidden:0 AND contract:3)
Run Code Online (Sandbox Code Playgroud)
$custom 包含用户通过 UI 构建的实际过滤器查询。假设笔记本蓝牙过滤器的名称为 fq_bluetooth,其值为:No、Yes 或值丢失。这将使最终的 fq 看起来像:
((-fq_bluetooth:[* TO *]) AND ((isdiscontinued:0 AND ishidden:0 AND contract:3)))
Run Code Online (Sandbox Code Playgroud)
但是,这会为我为此类别发送的查询返回 0 个产品。
如果我将过滤器查询修改为:
((fq_bluetooth:[* TO *]) AND ((isdiscontinued:0 AND ishidden:0 AND contract:3)))
Run Code Online (Sandbox Code Playgroud)
然后我得到了 Yes + No 计数的预期结果,不考虑未指定的。
我应该如何格式化过滤器查询以使其正常工作?
[编辑]
我可能还想结合这些方面,并且可能只过滤没有蓝牙的产品或未指定蓝牙的产品。所以也许像这样(当然这也不起作用):
((-fq_bluetooth:[* TO *] OR fq_bluetooth:"No") AND ((isdiscontinued:0 AND ishidden:0 AND contract:3)))
Run Code Online (Sandbox Code Playgroud)
我注意到 debugQuery 打开,我看到一个过滤器查询,如:
fq_bluetooth:("No" OR -[* TO …Run Code Online (Sandbox Code Playgroud)