我在如何构造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
df搜索进行的操作-很好)q=mfgpartno_search:DV\-5PBRP
q参数。q=DV\-5PBRP&defType=edismax&qf=mfgpartno_search
qf需要跨越更多字段。因为它需要搜索更多字段(实际qf
= productname_search shortdesc_search fulldesc_search mfgpartno_search productname shortdesc fulldesc keywords
)以获得更准确的搜索,所以我实现了阶段4。q=DV\-5PBRP&defType=edismax&qf=mfgpartno_search&q.op=AND
我在搜索时遇到的最大问题是,破折号等特殊字符有时必须是文字,有时又像产品名称或说明中的分隔符一样使用。有时人们甚至会在零件号搜索中搜索或将破折号替换为空格,但仍应显示相关数据。
我有点想知道如何使这种特殊字符搜索正常工作-特别是因为它与此mfgpartno_search字段有关。如何配置架构或查询(或同时配置两者)以使其正常工作?
最佳答案
也许您可以尝试使用正则表达式模式分词器,并为您的商品编号创建合适的正则表达式。 Lucene(Solr所基于的)非常专注于散文的标记化。
您在这里想要的大概是N克拆分以及1克拆分吗?也许破折号被空格代替,例如
DV-5PBRP-> {DV 5PBRP,DV,5P,BR,PB,RP,D,V,5,P,B,R}
如您所见,对于非常小的字段,索引将非常大。确保较大的ngram的结果排名具有较高的权重。
我确实认为您应该删除商品编号字段的停用词列表。
N-gram的大小可能应从1或2开始。
只需确保各种分析仪都不会:
关于search - Solr零件号中的破折号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29976132/