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

Apache Solr仅在存在通配符(*)时返回结果(使用Magento),magento,solr,Magento,Solr,我已经用Magento Enterprise Edition 1.9设置了Solr,在大多数情况下,它运行良好。但是,有些术语(如“香蕉”)即使在我的目录中产品名称包含“香蕉”一词,也不会返回任何结果 但是,只要我搜索带有通配符的“banana*”,它就会返回预期的结果 我已经为Solr使用了Magento的默认模式,所以我没有调整Solr模式文件的经验,所以任何建议都将不胜感激 编辑:这里是指向我的架构和配置文件的链接: 编辑2:使用搜索我的索引时,我注意到当我将默认字段从“全文”更改为“全文

我已经用Magento Enterprise Edition 1.9设置了Solr,在大多数情况下,它运行良好。但是,有些术语(如“香蕉”)即使在我的目录中产品名称包含“香蕉”一词,也不会返回任何结果

但是,只要我搜索带有通配符的“banana*”,它就会返回预期的结果

我已经为Solr使用了Magento的默认模式,所以我没有调整Solr模式文件的经验,所以任何建议都将不胜感激

编辑:这里是指向我的架构和配置文件的链接:


编辑2:使用搜索我的索引时,我注意到当我将默认字段从“全文”更改为“全文”或“名称”时,我的正常查询“香蕉”按预期工作。当我在模式中进行此更改时,搜索按预期工作。然而,这让我产生了更多的问题:我不确定“全文”与“全文”的关系。为什么“全文”不起作用,而“全文”起作用?“全文”不存在吗,因为它在Magento模式中?如果“全文”字段在我的模式中根本不存在,我怎么会得到任何搜索结果呢?

在没有看到您的模式的情况下,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>

solr.IndexBasedSplletChecker
/拼写检查
短信建议
频率
真的
将请求处理程序添加到组件中

    <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>
默认值
真的
3.
真的
真的
真的
拼写检查
或者,您可以创建与自动完成类似的新字段,如:

<!-- 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" />


请发布此默认模式和配置,solr查询也会很有帮助,我现在已经这样做了。谢谢。我已编辑以添加我的模式。当你说它只匹配“确切的单词”。。。搜索词不是一个局部词,而是一个精确的词。一个产品可以称为“古代香蕉吊床”,当我搜索“香蕉”时,它不起作用。如果我搜索“娜娜”,我可能会遇到问题,但“香蕉”应该有用吗?sofSolr可以得到更多的结果,就像正则表达式一样。如果您在“古代香蕉吊床”中查找“香蕉”,默认的solr搜索将不会返回任何内容,但如果您搜索“香蕉*”,则您告诉solr查找一个或多个出现的“香蕉”(我相信solr默认区分大小写)。模式中的“/spell”requestHandler似乎不正确,但您可以尝试“/terms”处理程序,以便qt=/terms(…/solr/collection/terms?q=Banana…)并查看它返回什么。