在没有通配符的情况下搜索Solr中的子字符串?

时间:2014-01-23 21:35:33

标签: php string search solr

我对Solr非常陌生,所以对我很轻松:)

我有一个争论的领域,以存储产品sku!如果文档中的sku是“SKU12345” - 如果输入查询“1234”,我将如何退回文档?

我以前曾尝试在特定于SKU的字段类型中使用solr.EdgeNGramFilterFactory,但不幸的是,这仅作为字符串前缀使用!

我想尝试避免使用外卡来保持性能最佳!

感谢:)

2 个答案:

答案 0 :(得分:2)

如果您是Solr的新手,并且您开始实现这样的功能,我建议您仔细阅读参考指南的Understanding Analyzers, Tokenizers, and Filters章节。由于有几种方法可以使您的查询匹配,但最佳选择取决于您的需求。

Arun的建议并不差,但单凭Ngrams更适合寻找一般词语。如果你想做某种预先输入或自动完成,你需要这个。例如用户开始在某处的输入字段中键入,并且您希望建议先前在分数中匹配的输入。如果您尝试单独使用Ngrams进行此匹配,则索引可能会变得非常大。因为您可能需要索引单词的所有排列,以便不会错过数字/单词开头或结尾的位置。


根据您的要求,我倾向于使用splitOnNumerics="1"建议the WordDelimiterFilter。因此输入SKU12345将被索引如下

  • SKU12345
  • 12345
  • SKU

因此,如果用户搜索12345,则会匹配。


如果你想要匹配它的片段 - 就像你说的那样1234 - 之后我会放置一个N-GramFilter。然后,您需要使用minGramSizemaxGramSize。您需要保持两个值之间的差距较小。由于差距越大,指数变得越大。

e.g。 * minGramSize=4maxGramSize=5,差距为1,排列很少 * minGramSize=1maxGramSize=5,差距4,更多排列

这取决于允许用户输入进行匹配的小小。


如果只有输入只能从开头匹配而且不能在中间点击片段,我建议the EdgeN-GramFilter作为N-GramFilter的更好选择。这只会从单词的开头生成片段,而不是从中间生成片段。这将导致指数规模的进一步缩小和更好的表现。


因此,如果你想让2345匹配SKU12345你需要Ngram,如果只有1234输入匹配SKU12345 EdgeNgram将会这样做。

答案 1 :(得分:0)

您也可以将side设置为“back”以从右到左生成ngrams。

http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.EdgeNGramFilterFactory