我们有一个在线商店,我们使用Solr搜索产品。基本设置工作正常,但目前它缺乏一些功能。我查了一些像亚马逊这样的在线商店,我喜欢他们提供的功能。所以我想,我怎么能配置Solr为我们的最终用户提供部分功能。
我们的产品数据包括
等产品的标准数据目前,我们正在使用此模式文件在Solr上编制索引并执行查询:
<fieldType name="text" class="solr.TextField" omitNorms="false">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StandardFilterFactory"/>
<filter class="solr.WordDelimiterFilterFactory" catenateWords="1" catenateAll="1" preserveOriginal="1"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StandardFilterFactory"/>
<filter class="solr.WordDelimiterFilterFactory" catenateWords="1" catenateAll="1" preserveOriginal="1"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.PorterStemFilterFactory"/>
<filter class="solr.PhoneticFilterFactory" encoder="DoubleMetaphone" inject="true"/>
</analyzer>
</fieldType>
EdgeNGramFilterFactory
将shirt
之类的字词编入sh
,shi
,shir
,shirt
WordDelimiterFilterFactory
将wi-fi
之类的字词分解为wi
,fi
,wifi
PorterStemFilterFactory
适用于阻止PhoneticFilterFactory
提供有点模糊搜索一个问题是,模糊搜索不能很好地工作。如果我搜索了该书Inferno
并将其与Infenro
拼错,则搜索不会返回任何结果。我已经阅读了SpellCheckComponent
(http://wiki.apache.org/solr/SpellCheckComponent),但我不确定这是进行模糊搜索的最佳方式,还是你的意思是什么?功能
第二个问题是,应该可以搜索Shirts red
以查找红色T恤(其中红色是选项类型颜色的选项值)或搜索woman shoes
或adidas shoes woman
。是否可以使用Solr执行此操作?
第三个问题是,我不确定schema.xml
中的哪个标记器和过滤器是实现这些功能的好选择。
我希望有人在solr中使用过这些功能,在这种情况下可以帮助我。 THX!
修改
以下是我们存储在Solr中的一些数据:
<doc>
<str name="id">572</str>
<arr name="taxons">
<str>cat1</str>
<str>cat1/cat2</str>
<str>cat1/cat2/cat3</str>
<str>cat1/cat4</str>
</arr>
<arr name="options">
<str>color_blue</str>
<str>color_red</str>
<str>size_39</str>
<str>size_40</str>
</arr>
<int name="count_on_hand">321</int>
<arr name="name_text">
<str>Riddle-Shirt Tech</str>
</arr>
<arr name="description_text">
<str>The Riddle Shirt Tech Men's Hoodie features signature details, along with ultra-lightweight fleece for optimum warmth.</str>
</arr>
<arr name="brand_text">
<str>Riddle</str>
</arr>
<arr name="retailer_text">
<str>Supershop</str>
</arr>
</doc>
我不确定options
键值对是否以正确的方式存储,但这是我提出的第一种方法。
答案 0 :(得分:7)
<强>声明强>:
我已对模式做了一些假设,因此请使用示例模式和数据检查要点 - https://gist.github.com/rchukh/7385672#file-19854599
E.g。对于分类单元我使用了PathHierarchyTokenizerFactory
的特殊文本字段 Inferno
与Infenro
不匹配的问题是因为它不是语音拼写错误。光照滤镜不适用于那种匹配。
如果您对某些细节感兴趣 - 这里有一篇关于lucene / solr支持的算法的非常好的文章:http://ntz-develop.blogspot.com/2011/03/phonetic-algorithms.html
您可能会对拼写检查整理功能
感兴趣http://wiki.apache.org/solr/SpellCheckComponent#spellcheck.collate
来自wiki:
排序规则是具有最佳建议的原始查询字符串 每个术语都被替换掉了。如果spellcheck.collate为true,Solr会 对每个令牌(如果存在)采取最佳建议并构建一个 来自建议的新查询。例如,如果输入查询是 “jawa class lording”和“jawa”的最佳建议是“java”和 “lording”是“加载”,然后得到的整理将是“java 类加载“。
您还可以根据距离算法利用fuzzy search feature(但据我所知,它对词组搜索更有用,例如proximity search)。 这是solr wiki的一个例子:
roam~
This search will match terms like foam and roams. It will also match the word "roam" itself.
因此查询中的Infenro~
应该与索引中的Inferno
相匹配...但我的赌注是采用“谷歌式”方法:
那就是 - 通知用户以下结果是正确的拼写,但也允许他使用错误的拼写(碰巧,有时用户可能是对的,机器可能是错误的。)
这个问题可以用edismax解决,例如:如果你想通过name_text和选项搜索:
q=shirt%20AND%20red&defType=edismax&qf=name_text%20options
您可以在此处查看此查询的解释计划 - http://explain.solr.pl/explains/w1qb7zie
将选项存储为带分隔符的多值字段的问题是搜索查询将开始匹配密钥,例如“颜色”。
例如 - 以下请求:
q=shirt%20AND%20color&defType=edismax&qf=name_text%20options
将匹配所有具有“颜色”选项的衬衫 - http://explain.solr.pl/explains/pn6fbpfq
我对在词干分析器之后使用任何FilterFactory有一些疑问,但目前无法提供一些有意义的信息。