我在如何构建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>
</fieldType>
让我将其分解为几个阶段(我只会进行足够的重复以解决问题 - 初始阶段不是使用edismax,这是我们选择使用的我们的网站):
q=DV\-5PBRP
&lt; - 使用此查询,我得到18个结果,但不是我要查找的结果(这很可能是对产品名称字段的默认df
搜索 - 细)q=mfgpartno_search:DV\-5PBRP
&lt; - 这给了我一个我想要的结果,但是由于我需要在网站上建立查询,如果我可以使用{ {1}}参数,如第1阶段。q
&lt; - 这也为我提供了我正在寻找的1个结果,但由于网站搜索q=DV\-5PBRP&defType=edismax&qf=mfgpartno_search
需要跨越更多字段。因为我需要搜索更多字段(实际qf
= qf
)以获得更准确的搜索,所以我实施了第4阶段。productname_search shortdesc_search fulldesc_search mfgpartno_search productname shortdesc fulldesc keywords
&lt; - 通过此测试,我得到0个结果 - 尽管这对我们网站上的大多数搜索都有效。我对搜索的一个大问题是像破折号这样的特殊字符,有时候必须是字面的,有时候会像产品名称或描述一样充当分隔符。有时人们甚至会在零件号搜索中用空格搜索或替换短划线,它仍应显示相关数据。
我有点坚持如何让这个特殊字符搜索工作 - 特别是因为它与这个mfgpartno_search字段有关。我如何配置架构或查询(或两者)以使其正常工作?
答案 0 :(得分:1)
也许您可以尝试使用正则表达式模式标记器,并为您的文章编号制作合适的正则表达式。 Lucene(Solr建立在其上)非常注重散文的标记化。
你想要的是N-gram分裂,以及1克?也许破折号用空格替换,比如
DV-5PBRP - &gt; {DV 5PBRP,DV,5P,BR,PB,RP,D,V,5,P,B,R}
正如您所看到的,对于非常小的字段,索引会非常大。确保结果的排名对较大的ngrams加权。
我认为您应该删除商品编号字段的停用词列表。
N-gram大小应该从1或2开始。
只需确保各种分析仪不会:
答案 1 :(得分:0)
如果您使用的是HTTP get方法,请对其进行编码并使用
发送URLEncoder.encode(searchWord,"UTF-8")
这是java的情况。如果您不使用java,请尝试相应的编码代码。这将有助于我们避免&#34; space&#34;,&#34; /&#34;喜欢的问题
答案 2 :(得分:0)
好吧,我认为这个问题被过度考虑了。
我假设(基于我的配置)示例部件号可能被编入索引:
DV-5PBRP -> {DV 5PBRP, DV5PBRP, DV-5PBRP} + NGrams
我还假设搜索“DV-5PBRP”(文字短划线)会匹配第三个选项(在我的问题中使用像#4这样的查询)。
昨天我再次被同一个用户警告过这个问题,我想我们试着在搜索中删除分隔符。所以现在搜索已成为:
q=DV5PBRP&defType=edismax&qf=mfgpartno_search&q.op=AND
我得到了我想要的结果,这意味着我的solr配置至少给了我一个像第二个索引选项的索引。
现在,在将搜索提交到SOLR之前,我已经开始从用户输入中修剪分隔符。这看起来很漂亮!