亚马逊喜欢用Solr搜索

23t*_*tux 5 lucene search solr full-text-search tokenize

我们有一个在线商店,我们使用Solr搜索产品.基本设置工作正常,但目前它缺乏一些功能.我查了一些像亚马逊这样的在线商店,我喜欢他们提供的功能.所以我想,我怎么能配置Solr 为我们的最终用户提供一些功能.

我们的产品数据包括类似产品的标准数据

  • 产品名称
  • 描述
  • 产品属于多个类别和子类别
  • 一个产品可以有多种选择,如红色,蓝色,绿色,S,M,L,XL的T恤......或16GB,32GB的iPad ......
  • 一个产品有一个品牌
  • 产品有零售商

目前,我们正在使用此模式文件来索引和执行对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>
Run Code Online (Sandbox Code Playgroud)
  • EdgeNGramFilterFactory索引的字像shirtsh,shi,shir,shirt
  • WordDelimiterFilterFactory分手的话犹如wi-fi进入wi,fi,wifi
  • PorterStemFilterFactory 适用于阻止
  • PhoneticFilterFactory 提供有点模糊的搜索

一个问题是,模糊搜索不能很好地工作.如果我搜索该书Inferno并将其拼写错误Infenro,则搜索不会返回任何结果.我已经读过SpellCheckComponent(http://wiki.apache.org/solr/SpellCheckComponent),但我不确定这是否是进行模糊搜索的最佳方式,或者你的意思是什么? 特征.

第二个问题是,应该可以搜索Shirts red找到红色T恤(红色是选项类型颜色的选项值)或搜索woman shoesadidas shoes woman.可以用Solr做到这一点吗?

第三个问题是,我不确定哪个标记器和过滤器schema.xml是实现这些功能的好选择.

我希望有人在solr中使用过这些功能,在这种情况下可以帮助我.谢谢!

编辑

以下是我们存储在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>
Run Code Online (Sandbox Code Playgroud)

我不确定options键值对是否以适当的方式存储,但这是我提出的第一种方法.

rch*_*ukh 8

免责声明:

我已经对模式做了一些假设,所以请用示例模式和数据检查要点 - https://gist.github.com/rchukh/7385672#file-19854599

例如,对于分类单元,我使用了PathHierarchyTokenizerFactory的特殊文本字段

第一个问题(模糊搜索):

为什么Inferno不匹配的问题Infenro是因为它不是拼音拼音.光照滤波器不适用于那种匹配.

如果您对某些细节感兴趣 - 这里有一篇关于lucene/solr支持的算法的非常好的文章:http://ntz-develop.blogspot.com/2011/03/phonetic-algorithms.html


您可能会对SpellCheck Collat​​e功能感兴趣

http://wiki.apache.org/solr/SpellCheckComponent#spellcheck.collat​​e

来自维基:

排序规则是原始查询字符串,其中包含替换的每个术语的最佳建议.如果spellcheck.collat​​e为true,Solr将为每个标记(如果存在)提供最佳建议,并根据建议构建新查询.例如,如果输入查询是"jawa class lording"并且"jawa"的最佳建议是"java"并且"lording"是"loading",那么得到的校对将是"java class loading".


您还可以利用基于距离算法的模糊搜索功能(但据我所知,它对短语搜索更有用,例如邻近搜索).这是solr wiki的一个例子:

roam~

This search will match terms like foam and roams. It will also match the word "roam" itself.
Run Code Online (Sandbox Code Playgroud)

所以Infenro~在查询中应该匹配Inferno索引...但我的赌注是采用"谷歌般的"方法:

谷歌拼写错误

也就是说 - 通知用户以下结果是正确的拼写,但也允许他使用错误的拼写(实际上,用户可能是正确的,机器可能是错误的).

第二个问题

这个问题可以用edismax解决,例如,如果你想通过name_text和options进行搜索:

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
Run Code Online (Sandbox Code Playgroud)

将匹配所有具有"颜色"选项的衬衫 - http://explain.solr.pl/explains/pn6fbpfq

第三个问题

我对在词干分析器之后使用任何FilterFactory有一些疑问,但目前无法提供一些有意义的信息.