如果存在通配符(*),则Apache Solr仅返回结果(使用Magento)

时间:2015-02-25 12:41:56

标签: magento solr

我让Solr设置了Magento Enterprise Edition 1.9,并且大多数情况下它运行良好。但是,即使我的目录中的产品名称包含“banana”一词,也有某些条款(例如“香蕉”)没有返回结果。

但是,只要我使用通配符搜索“banana *”,它就会按预期返回结果。

我使用了Magento的Solr默认模式,所以我没有调整Solr的模式文件的经验,所以任何建议都会受到赞赏。

修改:这是指向我的架构和配置文件的链接:https://gist.github.com/anonymous/8d7a7106eb4e594d5adc

编辑2:使用Luke浏览我的索引我注意到当我将默认字段从“fulltext”更改为“fulltext1_en”或“name_en”时,我的正常查询“banana”按预期工作。当我在架构中进行此更改时,搜索按预期工作。然而,这引出了更多问题:我不确定“全文”是如何与“fulltext1_en”相关的。为什么“全文”不起作用,但“fulltext1_en”呢?不存在“全文”,因为它是在Magento架构中吗?如果我的架构中根本不存在“全文”字段,那么我如何获得任何搜索结果呢?

1 个答案:

答案 0 :(得分:0)

在没有看到您的架构的情况下,solr中的标准关键字搜索仅返回该部分确切字的结果。就像你说的那样,添加一个通配符就像一个正则表达式,但有些结果只是垃圾。

一种解决方法是添加拼写检查组件:

<searchComponent name="spellcheck" class="solr.SpellCheckComponent">
  <lst name="spellchecker">
    <str name="classname">solr.IndexBasedSpellChecker</str>
    <str name="spellcheckIndexDir">./spellchecker</str>
    <str name="field">textsuggest</str>
    <str name="comparatorClass">freq</str>
    <str name="buildOnCommit">true</str>
  </lst>
</searchComponent>

在请求处理程序中添加组件

    <str name="spellcheck.dictionary">default</str>
    <str name="spellcheck">true</str>
    <str name="spellcheck.count">3</str>
    <str name="spellcheck.onlyMorePopular">true</str>
    <str name="spellcheck.extendedResults">true</str>
    <str name="spellcheck.collate">true</str>

    </lst>
    <arr name="last-components">
        <str>spellcheck</str>
    </arr>

或者您可以创建类似于自动填充的新字段,如:

<!-- autocomplete_edge : Will match from the left of the field, e.g. if the document field
         is "A brown fox" and the query is "A bro", it will match, but not "brown"
    -->
    <fieldType name="autocomplete_edge" class="solr.TextField">
        <analyzer type="index">
            <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
            <tokenizer class="solr.KeywordTokenizerFactory"/>
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.PatternReplaceFilterFactory" pattern="([\.,;:-_])" replacement=" " replace="all"/>
            <filter class="solr.EdgeNGramFilterFactory" maxGramSize="30" minGramSize="1"/>
            <filter class="solr.PatternReplaceFilterFactory" pattern="([^\w\d\*æøåÆØÅ ])" replacement="" replace="all"/>
        </analyzer>
        <analyzer type="query">
            <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
            <tokenizer class="solr.KeywordTokenizerFactory"/>
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.PatternReplaceFilterFactory" pattern="([\.,;:-_])" replacement=" " replace="all"/>
            <filter class="solr.PatternReplaceFilterFactory" pattern="([^\w\d\*æøåÆØÅ ])" replacement="" replace="all"/>
            <filter class="solr.PatternReplaceFilterFactory" pattern="^(.{30})(.*)?" replacement="$1" replace="all"/>
        </analyzer>
    </fieldType>

<field name="textnge" type="autocomplete_edge" indexed="true" stored="false" />