我让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架构中吗?如果我的架构中根本不存在“全文”字段,那么我如何获得任何搜索结果呢?
答案 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" />