零件号中的Solr搜索破折号

时间:2015-04-30 19:26:18

标签: search solr4

我在如何构建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,这是我们选择使用的我们的网站):

  1. q=DV\-5PBRP&lt; - 使用此查询,我得到18个结果,但不是我要查找的结果(这很可能是对产品名称字段的默认df搜索 - 细)
  2. q=mfgpartno_search:DV\-5PBRP&lt; - 这给了我一个我想要的结果,但是由于我需要在网站上建立查询,如果我可以使用{ {1}}参数,如第1阶段。
  3. q&lt; - 这也为我提供了我正在寻找的1个结果,但由于网站搜索q=DV\-5PBRP&defType=edismax&qf=mfgpartno_search需要跨越更多字段。因为我需要搜索更多字段(实际qf = qf)以获得更准确的搜索,所以我实施了第4阶段。
  4. productname_search shortdesc_search fulldesc_search mfgpartno_search productname shortdesc fulldesc keywords&lt; - 通过此测试,我得到0个结果 - 尽管这对我们网站上的大多数搜索都有效。
  5. 我对搜索的一个大问题是像破折号这样的特殊字符,有时候必须是字面的,有时候会像产品名称或描述一样充当分隔符。有时人们甚至会在零件号搜索中用空格搜索或替换短划线,它仍应显示相关数据。

    我有点坚持如何让这个特殊字符搜索工作 - 特别是因为它与这个mfgpartno_search字段有关。我如何配置架构或查询(或两者)以使其正常工作?

3 个答案:

答案 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之前,我已经开始从用户输入中修剪分隔符。这看起来很漂亮!