我想提供部分匹配,所以我在*搜索查询的末尾。我注意到,gatorade的搜索查询将返回12个结果,而gatorade *返回7.所以*似乎是1或许多而不是0或许多......我怎样才能实现这一点?我在索尔的部分匹配是否都错了?感谢。
答案 0 :(得分:7)
首先,我认为Solr通配符更好地概括为“0或许多”而不是“1或许多”。我怀疑这是你问题的根源。 (例如,请参阅the javadocs for WildcardQuery。)
第二,你是否正在使用词干,因为我的第一个猜测是你正在处理一个词干问题。 Solr通配符可以表现出奇怪的干扰。这是因为通配符扩展的基础是搜索存储在倒排索引中的术语列表;这些术语将采用词干形式(可能类似于“gatorad”),而不是原始源文本中的词语(可能是“gatorade”或“gatorades”)。
例如,假设您有一个将“gatorade”和“gatorades”映射到词干“gatorad”的词干分析器。这意味着您的倒排索引不包含“gatorade”或“gatorades”,只包含“gatorad”。如果您随后发出查询 gatorade * ,Solr将遍历术语索引,查找以“gatorade”开头的所有词干。但是没有这样的词干,所以你不会得到任何比赛。同样,如果您搜索 gatorades * ,Solr将查找以“gatorades”开头的所有词干。但是没有这样的词干,所以你不会得到任何匹配。
第三,为了获得最佳帮助,我建议发布更多信息,特别是:
答案 1 :(得分:2)
所以我想要的是为'gatorade'制作搜索词 - > 'gatorade OR gatorade *'将为我提供我正在寻找的所有比赛。
答案 2 :(得分:2)
如果您希望查询返回所有与gatorade的词干形式或以gatorade开头的词匹配的文档,则需要自己构造查询:+(gatorade gatorade *)。你可以选择扩展SolrParser来做到这一点,但这样做更多。
答案 3 :(得分:1)
另一种选择是使用NGrams和TokenFilterFactories, specifically the EdgeNGramFilterFactory。
这将为ngrams或部分单词创建索引。最小ngram大小为5,最大ngram大小为8的文档将索引:Docum Docume文档文档
索引大小和时间有一点折衷。其中一本Solr书籍引用作为粗略指南:索引需要10倍的时间使用5倍的磁盘空间创建6倍的不同术语。
然而,EdgeNGram会做得更好。
您确实需要确保在查询中不提交通配符。由于您没有进行通配符搜索,因此您在ngrams(单词部分)上匹配搜索词。
答案 4 :(得分:1)
我的猜测是缺少的比赛是" Gatorade" (使用大写' G'),你的字段上有一个小写过滤器。想法是你在schema.xml中有过滤器来预处理输入数据,但是通配符查询不使用它们; 看看Solr如何处理通配符查询:
http://solr.pl/en/2010/12/20/wildcard-queries-and-how-solr-handles-them/ (" Solr和通配符处理")。
答案 5 :(得分:0)
根据我读过的通配符,在搜索字词后只匹配带有其他字符的字词。 "佳得乐*"会匹配Gatorades而不是Gatorade本身。它似乎是版本3.6中对Solr的更新,通过使用' multiterm'字段类型而不是'文本'字段。
更好的描述如下:
http://bensch.be/the-solr-wildcard-problem-and-multiterm-solution